Michael Meskes <mes...@postgresql.org> writes: >> In the function ECPGnoticeReceiver, we use the stncpy function copy >> the >> sqlstate to sqlca->sqlstate. And the sqlca->sqlstate is defined as >> the size >> of 5, and the copy size is sizeof(sqlca->sqlstate). However, from the >> previous strcmp function, the sqlstate size may be 5,such as >> ECPG_SQLSTATE_INVALID_CURSOR_NAME. So there may be lack of the end >> character >> for sqlca->sqlstate.
> Why do you think there should be one? My memory might be wrong but I > don't think it's supposed to be a null terminated string. That field is defined as char[5] in struct sqlca_t, so the intent is clearly that it not be null terminated. However, it looks to me like there'd be at least one alignment-padding byte after it, and that byte is likely to be 0 in a lot of situations (particularly for statically allocated sqlca_t's). So a lot of the time, you could get away with using strcmp() or other functions that expect null termination. I'm thinking therefore that there's probably code out there that tries to do strcmp(sqlca->sqlstate, "22000") or suchlike, and it works often enough that the authors haven't identified their bug. The question is do we want to try to make that be valid code. Changing the field declaration to char[5+1] would be easy enough, but I have no idea how many places in ecpglib would need to change to make sure that the last byte gets set to 0. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers