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