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.

> 
> -- 
> :wq Claudio
> 
> Index: rtr_proto.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/bgpd/rtr_proto.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 rtr_proto.c
> --- rtr_proto.c       16 Aug 2023 08:26:35 -0000      1.17
> +++ rtr_proto.c       19 Oct 2023 08:35:49 -0000
> @@ -233,24 +233,21 @@ rtr_newmsg(struct rtr_session *rs, enum 
>      uint16_t session_id)
>  {
>       struct ibuf *buf;
> -     struct rtr_header rh;
>  
>       if (len > RTR_MAX_LEN) {
>               errno = ERANGE;
>               return NULL;
>       }
> -     len += sizeof(rh);
> +     len += sizeof(struct rtr_header);
>       if ((buf = ibuf_open(len)) == NULL)
>               return NULL;
>  
> -     memset(&rh, 0, sizeof(rh));
> -     rh.version = rs->version;
> -     rh.type = type;
> -     rh.session_id = htons(session_id);
> -     rh.length = htonl(len);
> -
>       /* cannot fail with fixed buffers */
> -     ibuf_add(buf, &rh, sizeof(rh));
> +     ibuf_add_n8(buf, rs->version);
> +     ibuf_add_n8(buf, type);
> +     ibuf_add_n16(buf, session_id);
> +     ibuf_add_n32(buf, len);
> +
>       return buf;
>  }
>  
> @@ -264,7 +261,6 @@ rtr_send_error(struct rtr_session *rs, e
>  {
>       struct ibuf *buf;
>       size_t mlen = 0;
> -     uint32_t hdrlen;
>  
>       rs->last_sent_error = err;
>       if (msg) {
> @@ -273,7 +269,7 @@ rtr_send_error(struct rtr_session *rs, e
>       } else
>               memset(rs->last_sent_msg, 0, sizeof(rs->last_sent_msg));
>  
> -     buf = rtr_newmsg(rs, ERROR_REPORT, 2 * sizeof(hdrlen) + len + mlen,
> +     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));
> @@ -281,11 +277,9 @@ rtr_send_error(struct rtr_session *rs, e
>       }
>  
>       /* cannot fail with fixed buffers */
> -     hdrlen = ntohl(len);
> -     ibuf_add(buf, &hdrlen, sizeof(hdrlen));
> +     ibuf_add_n32(buf, len);
>       ibuf_add(buf, pdu, len);
> -     hdrlen = ntohl(mlen);
> -     ibuf_add(buf, &hdrlen, sizeof(hdrlen));
> +     ibuf_add_n32(buf, mlen);
>       ibuf_add(buf, msg, mlen);
>       ibuf_close(&rs->w, buf);
>  
> @@ -313,9 +307,8 @@ static void
>  rtr_send_serial_query(struct rtr_session *rs)
>  {
>       struct ibuf *buf;
> -     uint32_t s;
>  
> -     buf = rtr_newmsg(rs, SERIAL_QUERY, sizeof(s), rs->session_id);
> +     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);
> @@ -323,8 +316,7 @@ rtr_send_serial_query(struct rtr_session
>       }
>  
>       /* cannot fail with fixed buffers */
> -     s = htonl(rs->serial);
> -     ibuf_add(buf, &s, sizeof(s));
> +     ibuf_add_n32(buf, rs->serial);
>       ibuf_close(&rs->w, buf);
>  }
>  
> 

Reply via email to