Fix copying SockAddr struct
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 12 Mar 2024 13:31:02 +0000 (15:31 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 12 Mar 2024 13:31:02 +0000 (15:31 +0200)
Valgrind alerted about accessing uninitialized bytes after commit
4945e4ed4a:

==700242== VALGRINDERROR-BEGIN
==700242== Conditional jump or move depends on uninitialised value(s)
==700242==    at 0x6D8A2A: getnameinfo_unix (ip.c:253)
==700242==    by 0x6D8BD1: pg_getnameinfo_all (ip.c:122)
==700242==    by 0x4B3EB6: BackendInitialize (postmaster.c:4266)
==700242==    by 0x4B684E: BackendStartup (postmaster.c:4114)
==700242==    by 0x4B6986: ServerLoop (postmaster.c:1780)
==700242==    by 0x4B80CA: PostmasterMain (postmaster.c:1478)
==700242==    by 0x3F7424: main (main.c:197)
==700242==  Uninitialised value was created by a stack allocation
==700242==    at 0x4B6934: ServerLoop (postmaster.c:1737)
==700242==
==700242== VALGRINDERROR-END

That was because the SockAddr struct was not copied correctly.

Per buildfarm animal "skink".

src/backend/libpq/pqcomm.c

index 9dfdccdd043c958e559e1fe047db174dc0271523..6497100a1a45e699faaa58d3d159189dcf11da0b 100644 (file)
@@ -177,7 +177,8 @@ pq_init(ClientSocket *client_sock)
    /* allocate the Port struct and copy the ClientSocket contents to it */
    port = palloc0(sizeof(Port));
    port->sock = client_sock->sock;
-   port->raddr = client_sock->raddr;
+   memcpy(&port->raddr.addr, &client_sock->raddr.addr, client_sock->raddr.salen);
+   port->raddr.salen = client_sock->raddr.salen;
 
    /* fill in the server (local) address */
    port->laddr.salen = sizeof(port->laddr.addr);