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

Reply via email to