Re: Protocol de-synchronisation bug, bogus query sent
От | Heikki Linnakangas |
---|---|
Тема | Re: Protocol de-synchronisation bug, bogus query sent |
Дата | |
Msg-id | 53A2BC4D.2030503@vmware.com обсуждение исходный текст |
Ответ на | Protocol de-synchronisation bug, bogus query sent (Craig Ringer <craig@2ndquadrant.com>) |
Список | pgsql-odbc |
On 06/19/2014 06:44 AM, Craig Ringer wrote: > The whole code block around connection.c:3082 appears to be attempting > to send an empty query in order to elicit an 'I' (EmptyQueryResponse) > message. It sends a malformed protocol message: > > SOCK_put_string(self->sock, "Q "); > SOCK_flush_output(self->sock); > > so the server just waits for the rest of the message, never responding. > > When the connection is killed by program exit later, the server will log: > > LOG: unexpected EOF within message length word > LOG: disconnection: session time: 0:00:08.910 user=Administrator > database=XXXX host=127.0.0.1 port=53705 > LOG: could not receive data from client: No connection could be made > because the target machine actively refused it. > > > That's because the V3 protocol specifies that the message format for > Query is: > > 'Q' > [32 bit integer] > [query string] > > http://www.postgresql.org/docs/current/static/protocol-message-formats.html > > ... but psqlODBC just sends: > > 'Q' > '\x20' > '\x00' > > If it is really necessary to go through this empty-query dance, then for > the V3 protocol the correct message would be: > > /* Send an empty query to elicit an 'I' (EmptyQueryResponse) > * from the server */ > SOCK_put_char(self->sock, 'Q'); > SOCK_put_int(self->sock, 5, 4); > SOCK_put_char(self->sock, '\0'); Hmm. Just before that code, there's this: > if (!beforeV2) > break; So we shouldn't even get there with protocol version 3. But if you managed to hit that, apparently we do. Can you debug that further? - Heikki
В списке pgsql-odbc по дате отправления: