On Mon, Nov 07, 2022 at 08:12:23PM +0100, Moritz Buhl wrote: > Hi tech, > Dear claudio, > > there could be an uninitialized stack memory access in pfkey_reply. > > It looks like this: > struct sadb_msg hdr, *msg; > ... > > do { > rv = pfkey_read(sd, &hdr); > if (rv == -1) > return (-1); > } while (rv); > > if (hdr.sadb_msg_errno != 0) { > > And in the errno cases of pfkey_read, it doesn't initialize hdr but > then breaks out of the do-while loop. > > OK?
OK claudio@ > mbuhl > > Found by CodeChecker. > > Index: bgpd/pfkey.c > =================================================================== > RCS file: /cvs/src/usr.sbin/bgpd/pfkey.c,v > retrieving revision 1.67 > diff -u -p -r1.67 pfkey.c > --- bgpd/pfkey.c 17 Aug 2022 15:15:26 -0000 1.67 > +++ bgpd/pfkey.c 7 Nov 2022 18:58:37 -0000 > @@ -423,7 +423,7 @@ pfkey_read(int sd, struct sadb_msg *h) > > if (recv(sd, &hdr, sizeof(hdr), MSG_PEEK) != sizeof(hdr)) { > if (errno == EAGAIN || errno == EINTR) > - return (0); > + return (1); > log_warn("pfkey peek"); > return (-1); > } > @@ -439,7 +439,7 @@ pfkey_read(int sd, struct sadb_msg *h) > /* not ours, discard */ > if (read(sd, &hdr, sizeof(hdr)) == -1) { > if (errno == EAGAIN || errno == EINTR) > - return (0); > + return (1); > log_warn("pfkey read"); > return (-1); > } > Index: ldpd/pfkey.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ldpd/pfkey.c,v > retrieving revision 1.12 > diff -u -p -r1.12 pfkey.c > --- ldpd/pfkey.c 23 Jan 2019 02:02:04 -0000 1.12 > +++ ldpd/pfkey.c 7 Nov 2022 19:00:01 -0000 > @@ -253,7 +253,7 @@ pfkey_read(int sd, struct sadb_msg *h) > > if (recv(sd, &hdr, sizeof(hdr), MSG_PEEK) != sizeof(hdr)) { > if (errno == EAGAIN || errno == EINTR) > - return (0); > + return (1); > log_warn("pfkey peek"); > return (-1); > } > @@ -269,7 +269,7 @@ pfkey_read(int sd, struct sadb_msg *h) > /* not ours, discard */ > if (read(sd, &hdr, sizeof(hdr)) == -1) { > if (errno == EAGAIN || errno == EINTR) > - return (0); > + return (1); > log_warn("pfkey read"); > return (-1); > } -- :wq Claudio