Re: [BlueZ 8/8] monitor: Check for possible integer underflow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Bastien,

On Mon, Aug 5, 2024 at 10:09 AM Bastien Nocera <hadess@xxxxxxxxxx> wrote:
>
> Error: INTEGER_OVERFLOW (CWE-190): [#def4] [important]
> bluez-5.77/monitor/control.c:1094:2: tainted_data_return: Called function "recv(data->fd, data->buf + data->offset, 1490UL - data->offset, MSG_DONTWAIT)", and a possible return value may be less than zero.
> bluez-5.77/monitor/control.c:1094:2: assign: Assigning: "len" = "recv(data->fd, data->buf + data->offset, 1490UL - data->offset, MSG_DONTWAIT)".
> bluez-5.77/monitor/control.c:1099:2: overflow: The expression "data->offset" is considered to have possibly overflowed.
> bluez-5.77/monitor/control.c:1115:3: overflow: The expression "data->offset -= pktlen + 6" is deemed overflowed because at least one of its arguments has overflowed.
> bluez-5.77/monitor/control.c:1118:4: overflow_sink: "data->offset", which might have underflowed, is passed to "memmove(data->buf, data->buf + 6 + pktlen, data->offset)". [Note: The source code implementation of the function has been overridden by a builtin model.]
> 1116|
> 1117|                   if (data->offset > 0)
> 1118|->                         memmove(data->buf, data->buf + MGMT_HDR_SIZE + pktlen,
> 1119|                                                                   data->offset);
> 1120|           }
> ---
>  monitor/control.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/monitor/control.c b/monitor/control.c
> index 009cf15209f0..62857b4b84de 100644
> --- a/monitor/control.c
> +++ b/monitor/control.c
> @@ -18,6 +18,7 @@
>  #include <stdbool.h>
>  #include <stddef.h>
>  #include <errno.h>
> +#include <limits.h>
>  #include <unistd.h>
>  #include <stdlib.h>
>  #include <string.h>
> @@ -1091,9 +1092,14 @@ static void client_callback(int fd, uint32_t events, void *user_data)
>                 return;
>         }
>
> +       if (sizeof(data->buf) <= data->offset)
> +               return;
> +
>         len = recv(data->fd, data->buf + data->offset,
>                         sizeof(data->buf) - data->offset, MSG_DONTWAIT);
> -       if (len < 0)
> +       if (len < 0 ||
> +           len > UINT16_MAX ||
> +           UINT16_MAX - data->offset > len)
>                 return;

Not really sure why we would be using UINT16_MAX here instead of
BTSNOOP_MAX_PACKET_SIZE or sizeof(data->buf), and perhaps we should
really check that len > sizeof(data->buf) - data->offset since that
implicitly guarantees data->offset + len <= sizeof(data->buf), anyway
this is again suggesting that a syscall can return a bigger value than
it was asked for.

>         data->offset += len;
> --
> 2.45.2
>
>


-- 
Luiz Augusto von Dentz





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux