On Thu, Aug 03, 2023 at 03:42:46PM +0200, Claudio Jeker wrote:
> iked has a special version of ibuf_size() called ibuf_length(). In the
> long run I want to remove this special case. The problem is that
> ibuf_length(NULL) returns 0 while ibuf_size() fails.
> Allowing the NULL pointer here results in bad code since it is no longer
> obvious if a buffer is initalised or not.
> 
> So here is a first step on cleaning up this mess. It switches all
> ibuf_length() calls to ibuf_size() where it is obvious that the argument
> is not NULL (e.g. when ibuf_data(buf) is just at the same time).
> Also in some cases the check should actually be if buf == NULL since
> in those cases the buf is later allocated. (ikev2_pld.c and
> ikev2.c::ikev2_sa_responder()).
> 
> Please double check if I did not introduce some error.

I agree that all the buffers you pass to ibuf_size() are non-NULL
either because they were previously checked, freshly allocated or
would lead to a code path where they would already be dereferenced
without your diff.

The conversions to NULL checks seem correct, so

ok tb.

One comment for tobhe and markus below

> -- 
> :wq Claudio
> 
> 
> Index: ca.c
> ===================================================================
> RCS file: /cvs/src/sbin/iked/ca.c,v
> retrieving revision 1.95
> diff -u -p -r1.95 ca.c
> --- ca.c      28 Jun 2023 14:10:24 -0000      1.95
> +++ ca.c      28 Jul 2023 11:29:25 -0000
> @@ -207,7 +207,7 @@ int
>  ca_certbundle_add(struct ibuf *buf, struct iked_id *id)
>  {
>       uint8_t          type = id->id_type;
> -     size_t           len = ibuf_length(id->id_buf);
> +     size_t           len = ibuf_size(id->id_buf);
>       void            *val = ibuf_data(id->id_buf);
>  
>       if (id == NULL ||

That id == NULL check doesn't make much sense given the above dereferences.

Reply via email to