2014/1/22 Enio <eni...@gmail.com>

> Pessoal,
>   Venho percebendo no log do PostgreSQL com muita frequência o erro abaixo:
> "tamanho do pacote de senha é invalido" e verificando o processo no banco
> de dados existe. Alguem tem uma informação que me ajuda a rastrear o erro
> reportado.
>
>
Eu não conhecia esse erro, então decidi dar uma investigada. Primeiro, a
mensagem de erro original (em inglês) é "invalid password packet size"
(recomendo a todos deixar mensagens em inglês, pois em português fica ruim
de rastrear).

Bom, a origem dessa mensagem é no arquivo src/backend/libpq/auth.c (hoje)
na linha 660 [1]. Olhando no código, dá pra ver que esse "erro" é enviado
com nível COMMERROR, que para o servidor é equivalente ao nível LOG, ou
seja, esse tipo de erro não irá abortar a operação, por isso você percebe
que o cliente continua conectado. Ou seja, se tudo está funcionando,
basicamente você vai ter que (a) conviver com essa mensagem de erro ou (b)
corrigir (talvez atualizar) o driver do seu cliente.

Como podem ver no link [1] (um pouco acima na verdade), temos as seguintes
linhas importantes:

 645     if (pq_getmessage(&buf, 1000))      /* receive password */
 646     {
...
 649         return NULL;
 650     }
 651
 652     /*
 653      * Apply sanity check: password packet length should agree with
length of
 654      * contained string.  Note it is safe to use strlen here because
 655      * StringInfo is guaranteed to have an appended '\0'.
 656      */
 657     if (strlen(buf.data) + 1 != buf.len)
 658         ereport(COMMERROR,
 659                 (errcode(ERRCODE_PROTOCOL_VIOLATION),
 660                  errmsg("invalid password packet size")));

A verificação é simples, checa se o tamanho (buf.len) do pacote que contém
a senha é igual à string (buf.data) dentro dele. Basicamente esse erro
aconteceria se o pacote enviado contém um caractere 0 (0x00 ou '\0') no
meio do pacote. Isso porque o pacote é formado por <n> + <c1>,<c2>,...<cn>,
onde "n" é o tamanho total e "ci" é o caractere da posição "i". Acredito
que o caso mais comum de um erro desse tipo seja uma implementação
equivocada do cliente, onde ele pega a senha, vamos supor por exemplo 1234,
e ao enviar o pacote já adiciona um '\0' no final.

Pesquisando um pouco, verifiquei que houve casos desse com o UniDAC [2], se
não me engano (nem procurei pra saber) é um driver pra Delphi, certo?


[1]
http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/libpq/auth.c;h=882dc8faf1b63161cdc353c31fb507a934eaeeb2;hb=HEAD#l660
[2] http://forums.devart.com/viewtopic.php?f=28&t=27742


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a