On Thu, Oct 19, 2023 at 01:26:49PM +0200, Claudio Jeker wrote:
> On Thu, Oct 19, 2023 at 12:59:17PM +0200, Theo Buehler wrote:
> > On Thu, Oct 19, 2023 at 10:41:07AM +0200, Claudio Jeker wrote:
> > > More ibuf cleanup. rtr_proto.c still uses ibuf_add() where it could use
> > > the new functions.
> > > 
> > > Two bits I'm unsure about:
> > > - I had to change some sizeof() to use native types (I especially dislike
> > >   the sizeof(struct rtr_header).
> > 
> > Yes, that's not very nice.
> > 
> > > - ibuf_add_nXX() can fail if the value is too large. Which should be
> > >   impossible but still maybe it would be better to check for errors.
> > 
> > While it should be impossible, the length calculations are non-trivial,
> > so it seems wiser to check.
> > 
> > It's a bit longer than what you have now, but maybe it's an option
> > to combine the length calculation with the errs += idiom.
> > 
> >     len += sizeof(rs->version);
> >     len += sizeof(type);
> >     len += sizeof(session_id);
> >     len += sizeof(len);
> > 
> >     if ((buf = ibuf_open(len)) == NULL)
> >             return NULL;
> > 
> >     errs += ibuf_add_n8(buf, rs->version);
> >     errs += ibuf_add_n8(buf, type);
> >     errs += ibuf_add_n16(buf, session_id);
> >     errs += ibuf_add_n32(buf, len);
> > 
> >     if (errs) {
> >             ibuf_free(ibuf);
> >             return NULL;
> >     }
> > 
> > I'm ok with the diff as it is and you can ponder how you want to shave
> > this particular Yak.
> 
> I like my yaks shaved like this...

I like this better than the errs dance, too.

ok tb

> The sizeof yak is still in queue... not sure about it.

It's not that horrible.

> -- 
> :wq Claudio
> 
> Index: rtr_proto.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rtr_proto.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 rtr_proto.c
> --- rtr_proto.c       19 Oct 2023 11:12:10 -0000      1.18
> +++ rtr_proto.c       19 Oct 2023 11:24:56 -0000
> @@ -233,6 +233,7 @@ rtr_newmsg(struct rtr_session *rs, enum 
>      uint16_t session_id)
>  {
>       struct ibuf *buf;
> +     int saved_errno;
>  
>       if (len > RTR_MAX_LEN) {
>               errno = ERANGE;
> @@ -240,15 +241,23 @@ rtr_newmsg(struct rtr_session *rs, enum 
>       }
>       len += sizeof(struct rtr_header);
>       if ((buf = ibuf_open(len)) == NULL)
> -             return NULL;
> -
> -     /* cannot fail with fixed buffers */
> -     ibuf_add_n8(buf, rs->version);
> -     ibuf_add_n8(buf, type);
> -     ibuf_add_n16(buf, session_id);
> -     ibuf_add_n32(buf, len);
> +             goto fail;
> +     if (ibuf_add_n8(buf, rs->version) == -1)
> +             goto fail;
> +     if (ibuf_add_n8(buf, type) == -1)
> +             goto fail;
> +     if (ibuf_add_n16(buf, session_id) == -1)
> +             goto fail;
> +     if (ibuf_add_n32(buf, len) == -1)
> +             goto fail;
>  
>       return buf;
> +
> + fail:
> +     saved_errno = errno;
> +     ibuf_free(buf);
> +     errno = saved_errno;
> +     return NULL;
>  }
>  
>  /*
> @@ -271,22 +280,27 @@ rtr_send_error(struct rtr_session *rs, e
>  
>       buf = rtr_newmsg(rs, ERROR_REPORT, 2 * sizeof(uint32_t) + len + mlen,
>           err);
> -     if (buf == NULL) {
> -             log_warn("rtr %s: send error report", log_rtr(rs));
> -             return;
> -     }
> -
> -     /* cannot fail with fixed buffers */
> -     ibuf_add_n32(buf, len);
> -     ibuf_add(buf, pdu, len);
> -     ibuf_add_n32(buf, mlen);
> -     ibuf_add(buf, msg, mlen);
> +     if (buf == NULL)
> +             goto fail;
> +     if (ibuf_add_n32(buf, len) == -1)
> +             goto fail;
> +     if (ibuf_add(buf, pdu, len) == -1)
> +             goto fail;
> +     if (ibuf_add_n32(buf, mlen) == -1)
> +             goto fail;
> +     if (ibuf_add(buf, msg, mlen) == -1)
> +             goto fail;
>       ibuf_close(&rs->w, buf);
>  
>       log_warnx("rtr %s: sending error report[%u] %s", log_rtr(rs), err,
>           msg ? msg : "");
>  
>       rtr_fsm(rs, RTR_EVNT_SEND_ERROR);
> +     return;
> +
> + fail:
> +     log_warn("rtr %s: send error report", log_rtr(rs));
> +     ibuf_free(buf);
>  }
>  
>  static void
> @@ -309,15 +323,17 @@ rtr_send_serial_query(struct rtr_session
>       struct ibuf *buf;
>  
>       buf = rtr_newmsg(rs, SERIAL_QUERY, sizeof(uint32_t), rs->session_id);
> -     if (buf == NULL) {
> -             log_warn("rtr %s: send serial query", log_rtr(rs));
> -             rtr_send_error(rs, INTERNAL_ERROR, "out of memory", NULL, 0);
> -             return;
> -     }
> -
> -     /* cannot fail with fixed buffers */
> -     ibuf_add_n32(buf, rs->serial);
> +     if (buf == NULL)
> +             goto fail;
> +     if (ibuf_add_n32(buf, rs->serial) == -1)
> +             goto fail;
>       ibuf_close(&rs->w, buf);
> +     return;
> +
> + fail:
> +     log_warn("rtr %s: send serial query", log_rtr(rs));
> +     ibuf_free(buf);
> +     rtr_send_error(rs, INTERNAL_ERROR, "out of memory", NULL, 0);
>  }
>  
>  /*

Reply via email to