Bug in dbdimp.c

Jacques Caron <[email protected]> Wed, 06 Apr 2011 15:34:30 +0100
Newsgroups gmane.comp.db.postgresql.dbdpg
Message-ID <[email protected]>
Hi all,

There seems to be a bug in dbd_st_split_statement, around line 1374 
of dbdimp.c in revision 14828 (at the end of the statement parsing loop):

>                 /* If this segment also, ended the string, set ch 
> so we bail out early */
>                 if ('\0' == *statement)
>                         break;

This code is (also) reached when ch (the current character) is 0, but 
statement points to the *next* character. In some rare cases, that 
means statement may point to unallocated memory, with the usual 
consequences. It is quite difficult to trigger, but it does actually happen :-/

I'm not quite sure what the point of the test is. I guess the goal 
would be to check ch rather than *statement, but this is redundant 
with the test at the beginning of the while(1) loop (which could BTW 
be rewritten while(ch) or while (ch>0) to keep the exact same 
semantics). Or the test at the start could be removed and a test on 
ch instead of *statement at the end, though I haven't checked if the 
test at the beginning might not catch a few other cases.

Let me know if I missed something...

Jacques.