2014/1/22 Enio <[email protected]>
> 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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral