Changeset f173b63669bf1fa0b58b00a88763d999fffcb115
- Timestamp:
- 09/18/07 01:15:37
(1 year ago)
- Author:
- Rafaël Carré <funman@videolan.org>
- git-committer:
- Rafaël Carré <funman@videolan.org> 1190070937 +0000
- git-parent:
[034015dae895274013ad2e472188b952a1343323]
- git-author:
- Rafaël Carré <funman@videolan.org> 1190070937 +0000
- Message:
str_format_meta(): fix HUGE memory leak & segfault.
realloc() can change the pointer initialised with malloc() if memory is low !
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| rd001ebd |
rf173b63 |
|
| 635 | 635 | } |
|---|
| 636 | 636 | |
|---|
| 637 | | #define INSERT_STRING( check, string ) \ |
|---|
| 638 | | if( check ) \ |
|---|
| | 637 | #define INSERT_STRING( string ) \ |
|---|
| | 638 | if( string != NULL ) \ |
|---|
| 639 | 639 | { \ |
|---|
| 640 | | psz_meta = string; \ |
|---|
| 641 | | if( psz_meta != NULL ) \ |
|---|
| 642 | | { \ |
|---|
| 643 | | int len = strlen( string ); \ |
|---|
| 644 | | dst = realloc( dst, \ |
|---|
| 645 | | i_size = i_size + len + 1 ); \ |
|---|
| 646 | | strncpy( d, psz_meta, len+1 ); \ |
|---|
| 647 | | d += len; \ |
|---|
| 648 | | } \ |
|---|
| 649 | | else \ |
|---|
| 650 | | { \ |
|---|
| 651 | | *d = '-'; \ |
|---|
| 652 | | d++; \ |
|---|
| 653 | | } \ |
|---|
| 654 | | } |
|---|
| | 640 | int len = strlen( string ); \ |
|---|
| | 641 | dst = realloc( dst, i_size = i_size + len );\ |
|---|
| | 642 | memcpy( (dst+d), string, len ); \ |
|---|
| | 643 | d += len; \ |
|---|
| | 644 | free( string ); \ |
|---|
| | 645 | } \ |
|---|
| | 646 | else \ |
|---|
| | 647 | { \ |
|---|
| | 648 | *(dst+d) = '-'; \ |
|---|
| | 649 | d++; \ |
|---|
| | 650 | } \ |
|---|
| 655 | 651 | |
|---|
| 656 | 652 | /* same than INSERT_STRING, except that string won't be freed */ |
|---|
| 657 | 653 | #define INSERT_STRING_NO_FREE( string ) \ |
|---|
| 658 | 654 | { \ |
|---|
| 659 | | int len = strlen( string ); \ |
|---|
| 660 | | dst = realloc( dst, \ |
|---|
| 661 | | i_size = i_size + len + 1 ); \ |
|---|
| 662 | | strncpy( d, string, len+1 ); \ |
|---|
| 663 | | d += len; \ |
|---|
| 664 | | free( string ); \ |
|---|
| 665 | | } |
|---|
| | 655 | int len = strlen( string ); \ |
|---|
| | 656 | dst = realloc( dst, i_size = i_size + len );\ |
|---|
| | 657 | memcpy( dst+d, string, len ); \ |
|---|
| | 658 | d += len; \ |
|---|
| | 659 | } |
|---|
| 666 | 660 | char *__str_format_meta( vlc_object_t *p_object, const char *string ) |
|---|
| 667 | 661 | { |
|---|
| 668 | 662 | const char *s = string; |
|---|
| 669 | | char *dst = malloc( 1000 ); |
|---|
| 670 | | char *d = dst; |
|---|
| 671 | 663 | int b_is_format = 0; |
|---|
| 672 | 664 | int b_empty_if_na = 0; |
|---|
| 673 | 665 | char buf[10]; |
|---|
| 674 | | int i_size = strlen( string ); |
|---|
| | 666 | int i_size = strlen( string ) + 1; /* +1 to store '\0' */ |
|---|
| | 667 | char *dst = malloc( i_size ); |
|---|
| | 668 | int d = 0; |
|---|
| 675 | 669 | |
|---|
| 676 | 670 | playlist_t *p_playlist = pl_Yield( p_object ); |
|---|
| … | … | |
| 692 | 686 | switch( *s ) |
|---|
| 693 | 687 | { |
|---|
| 694 | | char *psz_meta; /* used by INSERT_STRING */ |
|---|
| 695 | 688 | case 'a': |
|---|
| 696 | | INSERT_STRING( p_item, input_item_GetArtist(p_item) ); |
|---|
| | 689 | if( p_item ) |
|---|
| | 690 | { |
|---|
| | 691 | INSERT_STRING( input_item_GetArtist( p_item ) ); |
|---|
| | 692 | } |
|---|
| 697 | 693 | break; |
|---|
| 698 | 694 | case 'b': |
|---|
| 699 | | INSERT_STRING( p_item, input_item_GetAlbum(p_item) ); |
|---|
| | 695 | if( p_item ) |
|---|
| | 696 | { |
|---|
| | 697 | INSERT_STRING( input_item_GetAlbum( p_item ) ); |
|---|
| | 698 | } |
|---|
| 700 | 699 | break; |
|---|
| 701 | 700 | case 'c': |
|---|
| 702 | | INSERT_STRING( p_item, input_item_GetCopyright(p_item) ); |
|---|
| | 701 | if( p_item ) |
|---|
| | 702 | { |
|---|
| | 703 | INSERT_STRING( input_item_GetCopyright( p_item ) ); |
|---|
| | 704 | } |
|---|
| 703 | 705 | break; |
|---|
| 704 | 706 | case 'd': |
|---|
| 705 | | INSERT_STRING( p_item, input_item_GetDescription(p_item) ); |
|---|
| | 707 | if( p_item ) |
|---|
| | 708 | { |
|---|
| | 709 | INSERT_STRING( input_item_GetDescription( p_item ) ); |
|---|
| | 710 | } |
|---|
| 706 | 711 | break; |
|---|
| 707 | 712 | case 'e': |
|---|
| 708 | | INSERT_STRING( p_item, input_item_GetEncodedBy(p_item) ); |
|---|
| | 713 | if( p_item ) |
|---|
| | 714 | { |
|---|
| | 715 | INSERT_STRING( input_item_GetEncodedBy( p_item ) ); |
|---|
| | 716 | } |
|---|
| 709 | 717 | break; |
|---|
| 710 | 718 | case 'g': |
|---|
| 711 | | INSERT_STRING( p_item, input_item_GetGenre(p_item) ); |
|---|
| | 719 | if( p_item ) |
|---|
| | 720 | { |
|---|
| | 721 | INSERT_STRING( input_item_GetGenre( p_item ) ); |
|---|
| | 722 | } |
|---|
| 712 | 723 | break; |
|---|
| 713 | 724 | case 'l': |
|---|
| 714 | | INSERT_STRING( p_item, input_item_GetLanguage(p_item) ); |
|---|
| | 725 | if( p_item ) |
|---|
| | 726 | { |
|---|
| | 727 | INSERT_STRING( input_item_GetLanguage( p_item ) ); |
|---|
| | 728 | } |
|---|
| 715 | 729 | break; |
|---|
| 716 | 730 | case 'n': |
|---|
| 717 | | INSERT_STRING( p_item, input_item_GetTrackNum(p_item) ); |
|---|
| | 731 | if( p_item ) |
|---|
| | 732 | { |
|---|
| | 733 | INSERT_STRING( input_item_GetTrackNum( p_item ) ); |
|---|
| | 734 | } |
|---|
| 718 | 735 | break; |
|---|
| 719 | 736 | case 'p': |
|---|
| 720 | | INSERT_STRING( p_item, input_item_GetNowPlaying(p_item) ); |
|---|
| | 737 | if( p_item ) |
|---|
| | 738 | { |
|---|
| | 739 | INSERT_STRING( input_item_GetNowPlaying( p_item ) ); |
|---|
| | 740 | } |
|---|
| 721 | 741 | break; |
|---|
| 722 | 742 | case 'r': |
|---|
| 723 | | INSERT_STRING( p_item, input_item_GetRating(p_item) ); |
|---|
| | 743 | if( p_item ) |
|---|
| | 744 | { |
|---|
| | 745 | INSERT_STRING( input_item_GetRating( p_item ) ); |
|---|
| | 746 | } |
|---|
| 724 | 747 | break; |
|---|
| 725 | 748 | case 's': |
|---|
| … | … | |
| 730 | 753 | if( lang == NULL ) |
|---|
| 731 | 754 | lang = strdup( b_empty_if_na ? "" : "-" ); |
|---|
| 732 | | INSERT_STRING( 1, lang ); |
|---|
| | 755 | INSERT_STRING( lang ); |
|---|
| 733 | 756 | break; |
|---|
| 734 | 757 | } |
|---|
| 735 | 758 | case 't': |
|---|
| 736 | | INSERT_STRING( p_item, input_item_GetTitle(p_item) ); |
|---|
| | 759 | if( p_item ) |
|---|
| | 760 | { |
|---|
| | 761 | INSERT_STRING( input_item_GetTitle( p_item ) ); |
|---|
| | 762 | } |
|---|
| 737 | 763 | break; |
|---|
| 738 | 764 | case 'u': |
|---|
| 739 | | INSERT_STRING( p_item, input_item_GetURL(p_item) ); |
|---|
| | 765 | if( p_item ) |
|---|
| | 766 | { |
|---|
| | 767 | INSERT_STRING( input_item_GetURL( p_item ) ); |
|---|
| | 768 | } |
|---|
| 740 | 769 | break; |
|---|
| 741 | 770 | case 'A': |
|---|
| 742 | | INSERT_STRING( p_item, input_item_GetDate(p_item) ); |
|---|
| | 771 | if( p_item ) |
|---|
| | 772 | { |
|---|
| | 773 | INSERT_STRING( input_item_GetDate( p_item ) ); |
|---|
| | 774 | } |
|---|
| 743 | 775 | break; |
|---|
| 744 | 776 | case 'B': |
|---|
| … | … | |
| 782 | 814 | break; |
|---|
| 783 | 815 | case 'F': |
|---|
| 784 | | INSERT_STRING( p_item, input_item_GetURI( p_item ) ); |
|---|
| | 816 | if( p_item ) |
|---|
| | 817 | { |
|---|
| | 818 | INSERT_STRING( input_item_GetURI( p_item ) ); |
|---|
| | 819 | } |
|---|
| 785 | 820 | break; |
|---|
| 786 | 821 | case 'I': |
|---|
| … | … | |
| 813 | 848 | break; |
|---|
| 814 | 849 | case 'N': |
|---|
| 815 | | INSERT_STRING( p_item, input_item_GetName( p_item ) ); |
|---|
| | 850 | if( p_item ) |
|---|
| | 851 | { |
|---|
| | 852 | INSERT_STRING( input_item_GetName( p_item ) ); |
|---|
| | 853 | } |
|---|
| 816 | 854 | break; |
|---|
| 817 | 855 | case 'O': |
|---|
| … | … | |
| 823 | 861 | if( lang == NULL ) |
|---|
| 824 | 862 | lang = strdup( b_empty_if_na ? "" : "-" ); |
|---|
| 825 | | INSERT_STRING( 1, lang ); |
|---|
| | 863 | INSERT_STRING( lang ); |
|---|
| 826 | 864 | break; |
|---|
| 827 | 865 | } |
|---|
| … | … | |
| 877 | 915 | break; |
|---|
| 878 | 916 | case 'U': |
|---|
| 879 | | INSERT_STRING( p_item, input_item_GetPublisher(p_item) ); |
|---|
| | 917 | if( p_item ) |
|---|
| | 918 | { |
|---|
| | 919 | INSERT_STRING( input_item_GetPublisher( p_item ) ); |
|---|
| | 920 | } |
|---|
| 880 | 921 | break; |
|---|
| 881 | 922 | case 'V': |
|---|
| … | … | |
| 888 | 929 | } |
|---|
| 889 | 930 | case '_': |
|---|
| 890 | | *d = '\n'; |
|---|
| | 931 | *(dst+d) = '\n'; |
|---|
| 891 | 932 | d++; |
|---|
| 892 | 933 | break; |
|---|
| … | … | |
| 897 | 938 | |
|---|
| 898 | 939 | default: |
|---|
| 899 | | *d = *s; |
|---|
| | 940 | *(dst+d) = *s; |
|---|
| 900 | 941 | d++; |
|---|
| 901 | 942 | break; |
|---|
| … | … | |
| 911 | 952 | else |
|---|
| 912 | 953 | { |
|---|
| 913 | | *d = *s; |
|---|
| | 954 | *(dst+d) = *s; |
|---|
| 914 | 955 | d++; |
|---|
| 915 | 956 | } |
|---|
| 916 | 957 | s++; |
|---|
| 917 | 958 | } |
|---|
| 918 | | *d = '\0'; |
|---|
| | 959 | *(dst+d) = '\0'; |
|---|
| 919 | 960 | |
|---|
| 920 | 961 | if( p_input ) |
|---|