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]

Reply via email to