On Sat, 5 Nov 2005 03:14:38 +0100 Elmar Hoffmann wrote: > Hi David, > > on Fri, Nov 04, 2005 at 19:22:38 -0500, you wrote: > > > The attached patch fixes both problems. > > But unfortunately introduces new ones: > > > static char *get_string(const char *name, const char *arg) > > { > > char *s = xstrdup(arg); > > + > > + /* scan option to delete comment (after '#') and preceding > > whitespace */ > > + char *t = s; > > t initially points to s, a copy of arg... > > > + bool quote = false; > > + for (t = s; *t != '\0' ; t += 1) > > + { > > + char c = *t; > > + if (c == '"') > > + quote ^= true; > > + if (!quote && c == '#') { > > + *t-- = '\0'; > > ...if arg starts with a '#' (ie. something like "option=# foo" in the > config), t will now point one byte before the beginning of s... > > > + while (isspace(*t)) > > ...and thus a faulty memory access will happen here. > > > + *t-- = '\0'; > > + break; > > + } > > + } > > The attached fixed version of the patch avoids this (and further code > duplication) by using the existing remove_comment() function, which > already is used by other get_*() functions. > > The other problem is that init_charset_table_iconv() is not the only > place bf_iconv_open() is used without checking for a result of -1. > text_decode() in lexer.c contains the lines > cd = bf_iconv_open( charset_unicode, charset ); > iconvert_cd(cd, &src, buf); > and iconvert_cd() checks for cd == NULL only. > > Thus I think it makes more sense to fix bf_iconv_open() itself to > always return NULL on failure, like in the attached patch. > > elmar
Nice work, elmar! Your observations about the code are very good, though not totally correct. If you look at function process_config_option(), you'll see that the original config line is duplicated and split at the '=' character (which has been replaced by '\0'). The "*t--" code is applied to the part after '=' and the loop to erase whitespace will never backup to the part before the '='. When I made the quick change to get_string(), I hadn't fully analyzed the situation and had assumed (rather than determined) that all was safe. In any case, using remove_comment() is the better solution, as is using xd=NULL. CVS now has the new version. In honor of your contribution to the code base, your name has been added to the AUTHORS list. Well done! David -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]