[PATCH] babel: Initialise objects from slab completely
andreas at rammhold.de
andreas at rammhold.de
Mon Nov 23 00:58:06 CET 2020
On 23:08 22.11.20, Toke Høiland-Jørgensen wrote:
> The babel protocol code was initialising objects returned from the slab
> allocator by assigning to each of the struct members individually, but
> wasn't touching the NODE member while doing so. This leads to warnings on
> debug builds since commit:
>
> baac7009063d ("List expensive check.")
>
> So let's change the babel code to make sure we also zero-initialise the
> list node. For the packet parser, just move the existing memset() out of
> babel_read_tlv() and in all other places, use struct assignment for
> initialising members, which is idiomatic for Bird.
>
> Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
> ---
> proto/babel/babel.c | 31 ++++++++++++++++++-------------
> proto/babel/packets.c | 7 ++++---
> 2 files changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/proto/babel/babel.c b/proto/babel/babel.c
> index 618abaa8a..588b29eaa 100644
> --- a/proto/babel/babel.c
> +++ b/proto/babel/babel.c
> @@ -114,10 +114,12 @@ babel_get_source(struct babel_proto *p, struct babel_entry *e, u64 router_id)
> return s;
>
> s = sl_alloc(p->source_slab);
> - s->router_id = router_id;
> - s->expires = current_time() + BABEL_GARBAGE_INTERVAL;
> - s->seqno = 0;
> - s->metric = BABEL_INFINITY;
> + *s = (struct babel_source) {
> + .router_id = router_id,
> + .expires = current_time() + BABEL_GARBAGE_INTERVAL,
> + .seqno = 0,
> + .metric = BABEL_INFINITY,
> + };
> add_tail(&e->sources, NODE s);
>
> return s;
> @@ -160,10 +162,10 @@ babel_get_route(struct babel_proto *p, struct babel_entry *e, struct babel_neigh
> return r;
>
> r = sl_alloc(p->route_slab);
> - memset(r, 0, sizeof(*r));
> -
> - r->e = e;
> - r->neigh = nbr;
> + *r = (struct babel_route) {
> + .e = e,
> + .neigh = nbr
> + };
> add_tail(&e->routes, NODE r);
> add_tail(&nbr->routes, NODE &r->neigh_route);
>
> @@ -326,11 +328,14 @@ babel_add_seqno_request(struct babel_proto *p, struct babel_entry *e,
> sr = sl_alloc(p->seqno_slab);
>
> found:
> - sr->router_id = router_id;
> - sr->seqno = seqno;
> - sr->hop_count = hop_count;
> - sr->count = 0;
> - sr->expires = current_time() + BABEL_SEQNO_REQUEST_EXPIRY;
> + *sr = (struct babel_seqno_request) {
> + .router_id = router_id,
> + .seqno = seqno,
> + .hop_count = hop_count,
> + .count = 0,
> + .expires = current_time() + BABEL_SEQNO_REQUEST_EXPIRY,
> + };
> +
> babel_lock_neighbor(sr->nbr = nbr);
> add_tail(&e->requests, NODE sr);
>
> diff --git a/proto/babel/packets.c b/proto/babel/packets.c
> index d4ecf649d..98037ce69 100644
> --- a/proto/babel/packets.c
> +++ b/proto/babel/packets.c
> @@ -1144,7 +1144,6 @@ babel_read_tlv(struct babel_tlv *hdr,
> return PARSE_ERROR;
>
> state->current_tlv_endpos = tlv_data[hdr->type].min_length;
> - memset(msg, 0, sizeof(*msg));
>
> int res = tlv_data[hdr->type].read_tlv(hdr, msg, state);
> if (res != PARSE_SUCCESS)
> @@ -1278,7 +1277,7 @@ babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest)
> struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
> list queue;
>
> - msgn->msg = *msg;
> + *msgn = (struct babel_msg_node) { .msg = *msg };
> init_list(&queue);
> add_tail(&queue, NODE msgn);
> babel_write_queue(ifa, &queue);
> @@ -1305,7 +1304,7 @@ babel_enqueue(union babel_msg *msg, struct babel_iface *ifa)
> {
> struct babel_proto *p = ifa->proto;
> struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
> - msgn->msg = *msg;
> + *msgn = (struct babel_msg_node) { .msg = *msg };
> add_tail(&ifa->msg_queue, NODE msgn);
> babel_kick_queue(ifa);
> }
> @@ -1387,6 +1386,8 @@ babel_process_packet(struct babel_pkt_header *pkt, int len,
> }
>
> msg = sl_alloc(p->msg_slab);
> + memset(msg, 0, sizeof(*msg));
Likely something for another commit but maybe adding an sl_allocz
variant that always returns zeroed memory would be helpful? I think
Maria wrote something similar in their mail earlier.
> +
> res = babel_read_tlv(tlv, &msg->msg, &state);
> if (res == PARSE_SUCCESS)
> {
> --
> 2.29.2
>
This removes most of the traces I've reported previously
(Message-Id:<20201122154715.waewttuqdm6jm4gb at wrt>).
If BIRD does Test-By lines:
Tested-By: Andreas Rammhold <andreas at rammhold.de>
More information about the Bird-users
mailing list