On Thu, Jun 16, 2022 at 02:42:31PM +0200, Claudio Jeker wrote:
> tb@ noticed that name2id conversions never check for error.
> Now I think this is fine but in that case the api should not do a half
> assed job of setting errnos.
>
> In the end if 0 is returned from name2id but the input was not the empty
> string then an error occurred. None of the callers does this check and
> instead accept that the label is silently dropped.
>
> Most labels come from the config only rtlabel will be picked up from the
> kernel FIB. So I don't think that dropping such lables on the floor is a
> bad thing. Also the kernel has very similar limitations.
I agree with your description and the diff.
ok
>
> --
> :wq Claudio
>
> Index: name2id.c
> ===
> RCS file: /cvs/src/usr.sbin/bgpd/name2id.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 name2id.c
> --- name2id.c 6 Feb 2022 09:51:19 - 1.11
> +++ name2id.c 14 Jun 2022 17:03:47 -
> @@ -94,16 +94,18 @@ pftable_ref(uint16_t id)
> return (_ref(&pftable_labels, id));
> }
>
> +/*
> + * Try to convert a name into id. If something fails 0 is returned which
> + * is the ID of the empty label.
> + */
> uint16_t
> _name2id(struct n2id_labels *head, const char *name)
> {
> struct n2id_label *label, *p = NULL;
> uint16_t new_id = 1;
>
> - if (!name[0]) {
> - errno = EINVAL;
> + if (!name[0])
> return (0);
> - }
>
> TAILQ_FOREACH(label, head, entry)
> if (strcmp(name, label->name) == 0) {
> @@ -122,10 +124,8 @@ _name2id(struct n2id_labels *head, const
> p->id == new_id; p = TAILQ_NEXT(p, entry))
> new_id = p->id + 1;
>
> - if (new_id > IDVAL_MAX) {
> - errno = ERANGE;
> + if (new_id > IDVAL_MAX)
> return (0);
> - }
>
> if ((label = calloc(1, sizeof(struct n2id_label))) == NULL)
> return (0);
>