Re: bgpd name2id change

2022-06-16 Thread Theo Buehler
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);
> 



bgpd name2id change

2022-06-16 Thread Claudio Jeker
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.

-- 
: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);