Bug Report with Postgres 7.4 on AIX 5.3 - Mailing list pgsql-bugs

From Vincent Vanwynsberghe
Subject Bug Report with Postgres 7.4 on AIX 5.3
Date
Msg-id IKEPJJEJDCJPKMLEECEDGEIHCCAA.vvanwynsberghe@ccncsi.net
Whole thread Raw
Responses Re: Bug Report with Postgres 7.4 on AIX 5.3  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
Dear Support,

We try to install Postgres 7.4 on AIX 5.3 (IBM,9111-520).
The compilation is good and we are able to start the postmaster.
When we try to start the psql we got the following error :
FATAL:  unsupported frontend protocol 0.0: server supports 1.0 to 3.0

We run the psql under the AIX debugger dbx and our conclusions are the
following :

In the file fe-connect.c we try to copy a area of 1025 in the
conn->raddr.addr area but the size of that area is only 144.
The result is a corruption of the pg_conn structure

 +1175                                          /* Remember current address
for possible error msg */
 +1176                                          memcpy(&conn->raddr.addr,
addr_cur->ai_addr,
 +1177
addr_cur->ai_addrlen);


The addr_cur->ai_addrlen is set with the sizeof(struct sockaddr_un) in the
file ip.c.

In the file libpq-int.h the structure pg_conn contains 2 fields SockAddr
 * PGconn stores all the state data associated with a single connection
 * to a backend.
 */
struct pg_conn
{
...
 SockAddr        laddr;                  /* Local address */
 SockAddr        raddr;
...
}

The structure SockAddr is defined in the file pqcomm.h

typedef struct
{
        struct sockaddr_storage addr;
        ACCEPT_TYPE_ARG3 salen;
} SockAddr;


On Our AIX 5.3 the sockaddr_un is defined in the file /usr/include/sys/un.h

#if defined(COMPAT_43) && !defined(_KERNEL)
struct  sockaddr_un {
        ushort_t        sun_family;     /* AF_UNIX */
        char        sun_path[PATH_MAX]; /* changed from 104 to PATH_MAX to
support long user names */
};
#else
struct  sockaddr_un {
        uchar_t     sun_len;            /* sockaddr len including null */
        sa_family_t sun_family;         /* AF_UNIX */
        char        sun_path[PATH_MAX]; /* changed from 104 to PATH_MAX to
support long user names */
};
#endif /* COMPAT_43 && !_KERNEL */

PATH_MAX is defined in the file /usr/include/sys/limits.h

#if _POSIX_C_SOURCE >= 200112L && !(defined _ALL_SOURCE) ||
defined(_PATHMAX_HAS_NULL)
#define PATH_MAX        1024            /* max number of bytes in a
pathname.
                                           includes a terminating null */
#else
#define PATH_MAX        1023
#endif

In our platform the sizeof of struct  sockaddr_un is 1025 and the sizeof of
SockAddr is 144.
In conclusion the instructions done in the function PQconnectPoll cause a
memory overflow !!!

+1175                                          /* Remember current address
for possible error msg */
+1176                                          memcpy(&conn->raddr.addr,
addr_cur->ai_addr,
+1177
addr_cur->ai_addrlen);

Are you aware about this problem ?
Could you give us a way to solve the problem ?

Kind Regards,
Vincent Vanwynsberghe


pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: BUG #1655: trapping errors doesn't work
Next
From: "Sergio Lob"
Date:
Subject: BUG #1656: ResultSetMetaData.getColumnDisplaySize() returns value -1