Update of /cvsroot/mplayer/main In directory mail:/var/tmp.root/cvs-serv30703 Modified Files: m_option.c Log Message: disable free() in string and string_list parsers. yes, it's a hack (and a little memleak), but i can explain :) [note it's just a few kB memleak, but it's the price of stability without full code review/audit - there are hunderds of possible double free()] the old config parser didn't free() strings/stringlists, but didn't even allocate them by default. the new one always free(), and it causes memcorruption/sig11 at cases like this: char* dvd_device="/dev/dvd"; {"dvd-device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL}, since string constansts (allocated in .TEXT segment) cannot be free()'d Index: m_option.c =================================================================== RCS file: /cvsroot/mplayer/main/m_option.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- m_option.c 3 Jan 2003 12:40:09 -0000 1.5 +++ m_option.c 30 Jan 2003 21:28:01 -0000 1.6 @@ -321,14 +321,14 @@ static void copy_str(m_option_t* opt,void* dst, void* src) { if(dst && src) { - if(VAL(dst)) free(VAL(dst)); +// if(VAL(dst)) free(VAL(dst)); //FIXME!!! VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL; } } static void free_str(void* src) { if(src && VAL(src)){ - free(VAL(src)); +// free(VAL(src)); //FIXME!!! VAL(src) = NULL; } } @@ -365,10 +365,10 @@ if(!dst || !VAL(dst)) return; d = VAL(dst); - - for(i = 0 ; d[i] != NULL ; i++) - free(d[i]); - free(d); +// FIXME!!! +// for(i = 0 ; d[i] != NULL ; i++) +// free(d[i]); +// free(d); VAL(dst) = NULL; }
Hi Arpi of Ize, on Thu, 30 Jan 2003 22:28:17 +0100 you wrote:
Update of /cvsroot/mplayer/main In directory mail:/var/tmp.root/cvs-serv30703
Modified Files: m_option.c Log Message: disable free() in string and string_list parsers. yes, it's a hack (and a little memleak), but i can explain :) [note it's just a few kB memleak, but it's the price of stability without full code review/audit - there are hunderds of possible double free()]
the old config parser didn't free() strings/stringlists, but didn't even allocate them by default. the new one always free(), and it causes memcorruption/sig11 at cases like this:
char* dvd_device="/dev/dvd"; {"dvd-device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL},
since string constansts (allocated in .TEXT segment) cannot be free()'d
Hi, ok let me clarify this a bit. Some kind of options type have to be handled with dynamic memory, like strings, etc. I wanted to avoid (if possible) any memory leak, but came the problem that you are pointing out here, static vs. dynamic. The example you show shouldn't cause any trouble as on init (ie when options are registered) any non-NULL value will be replaced by a dynamic copy so you can still use static values for the default values. But after that if you assign a value to such an option it MUST be dynamicly allocated and you should free the current value if non-NULL. Anyway I should look at this if it still isn't fixed. Albeu
participants (2)
-
Alban Bedel -
Arpi of Ize