On 3 September 2012 21:34, Stefan Weil <s...@weilnetz.de> wrote:
> Report from smatch:
> slirp/tcp_subr.c:127 tcp_respond(17) error:
>  we previously assumed 'tp' could be null (see line 124)
>
> Fix this by checking 'tp' before reading its elements.
>
> The type casts of pointers to long are not related to the smatch report
> but happened to be near that code. Those type casts are not allowed
> when sizeof(pointer) != sizeof(long).

I think these would be better in a separate patch.
> @@ -124,7 +124,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct 
> mbuf *m,
>         if (tp)
>                 win = sbspace(&tp->t_socket->so_rcv);
>          if (m == NULL) {
> -               if ((m = m_get(tp->t_socket->slirp)) == NULL)
> +               if (tp && (m = m_get(tp->t_socket->slirp)) == NULL)
>                         return;
>                 tlen = 0;
>                 m->m_data += IF_MAXLINKHDR;

This doesn't look quite right -- now if tp is NULL we will skip
the assignment to m and dereference a NULL pointer a few lines
further on, right?

I suspect that we need either to be passed our Slirp* explicitly rather
than via tp, or  we have to enforce that tcp_respond() is called with
a non-NULL struct tcpcb*. I think the only cases where tp can be non-NULL
at the moment are the two calls from the dropwithreset code in tcp_input().

-- PMM

Reply via email to