On Fri, May 26, 2023 at 11:18:26AM +0200, Theo Buehler wrote: > On Fri, May 26, 2023 at 10:11:32AM +0200, Claudio Jeker wrote: > > Kill ibuf_prepend() it is used only once and the function does unholy > > things to the ibuf passed in. Just do the obivous dance in the callee. > > The only thing to be careful about is the fact that all pointers of buf > > are replaced (msg->msg_data). > > > > Tested with iked -t (which should use this codepath). > > What can I say. Unholy is a nice way of putting it. This is rather > horrible. I agree, inlining it makes sense. > > It is a bit scary to do ibuf_free(buf); (which ibuf_prepend() is careful > not to do) since that is passed in by the caller. In turn, pointers are > no longer transferred via memcpy, which is a good thing in my book...
This ibuf_prepend() pattern is scary. Now if we have more places where something like this is used then it may make sense to add an ibuf_prepend() to the real ibuf API but right now I only found this one use case. > Arguably, ownership of the caller's buf is transferred to resp.msg_data > in all cases, so that is fine except that it is still a bit of a trap. > If this was my code I would probably insist on invalidating the buf in > the caller after hanging it onto resp. The livecycle of these bufs is a bit of a mysterybox. Now the msg->msg_data buf is created in ikev2_msg_init() and should not have other pointers lingering around. So I agree with your assesment and that this is still a bit of a trap. This codebase is using ibufs in very creative ways and it is not always clear to me why it is done that way. > ok tb > > But please fix the leak indicated below. Fixed, thanks for spotting. > > -- > > :wq Claudio > > > > Index: iked.h > > =================================================================== > > RCS file: /cvs/src/sbin/iked/iked.h,v > > retrieving revision 1.213 > > diff -u -p -r1.213 iked.h > > --- iked.h 23 May 2023 13:57:14 -0000 1.213 > > +++ iked.h 26 May 2023 07:21:43 -0000 > > @@ -1279,7 +1279,6 @@ struct ibuf * > > ibuf_dup(struct ibuf *); > > struct ibuf * > > ibuf_random(size_t); > > -int ibuf_prepend(struct ibuf *, void *, size_t); > > int ibuf_strcat(struct ibuf **, const char *); > > int ibuf_strlen(struct ibuf *); > > > > Index: ikev2_msg.c > > =================================================================== > > RCS file: /cvs/src/sbin/iked/ikev2_msg.c,v > > retrieving revision 1.92 > > diff -u -p -r1.92 ikev2_msg.c > > --- ikev2_msg.c 23 May 2023 13:57:14 -0000 1.92 > > +++ ikev2_msg.c 26 May 2023 07:20:13 -0000 > > @@ -290,10 +290,17 @@ ikev2_msg_send(struct iked *env, struct > > ibuf_length(buf), isnatt ? ", NAT-T" : ""); > > > > if (isnatt) { > > - if (ibuf_prepend(buf, &natt, sizeof(natt)) == -1) { > > + struct ibuf *new; > > + if ((new = ibuf_new(&natt, sizeof(natt))) == NULL) { > > log_debug("%s: failed to set NAT-T", __func__); > > return (-1); > > } > > + if (ibuf_cat(new, buf) == -1) { > > This needs an > > ibuf_free(new); > > > + log_debug("%s: failed to set NAT-T", __func__); > > + return (-1); > > + } > > + ibuf_free(buf); > > + buf = msg->msg_data = new; > > } > > > > if (sendtofrom(msg->msg_fd, ibuf_data(buf), ibuf_size(buf), 0, > > Index: imsg_util.c > > =================================================================== > > RCS file: /cvs/src/sbin/iked/imsg_util.c,v > > retrieving revision 1.16 > > diff -u -p -r1.16 imsg_util.c > > --- imsg_util.c 23 May 2023 13:57:14 -0000 1.16 > > +++ imsg_util.c 26 May 2023 07:21:26 -0000 > > @@ -146,25 +146,6 @@ ibuf_setsize(struct ibuf *buf, size_t le > > } > > > > int > > -ibuf_prepend(struct ibuf *buf, void *data, size_t len) > > -{ > > - struct ibuf *new; > > - > > - /* Swap buffers (we could also use memmove here) */ > > - if ((new = ibuf_new(data, len)) == NULL) > > - return (-1); > > - if (ibuf_cat(new, buf) == -1) { > > - ibuf_free(new); > > - return (-1); > > - } > > - free(buf->buf); > > - memcpy(buf, new, sizeof(*buf)); > > - free(new); > > - > > - return (0); > > -} > > - > > -int > > ibuf_strcat(struct ibuf **buf, const char *s) > > { > > size_t slen; > > > -- :wq Claudio