]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/mtracebis_netlink.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / mtracebis_netlink.c
index a66da87e1b0175208303d4bc63ecf10d3a168fbc..47b5f7e52c0a0c275dbcc581531d8b30152e1668 100644 (file)
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #ifdef __linux__
 
 #include <stdio.h>
@@ -239,7 +243,7 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
                                        break; /* process next filter */
                                }
                                if (h->nlmsg_type == NLMSG_ERROR) {
-                                       struct nlmsgerr *err =
+                                       struct nlmsgerr *merr =
                                                (struct nlmsgerr *)NLMSG_DATA(
                                                        h);
                                        if (h->nlmsg_len
@@ -248,7 +252,7 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
                                                fprintf(stderr,
                                                        "ERROR truncated\n");
                                        } else {
-                                               errno = -err->error;
+                                               errno = -merr->error;
                                                perror("RTNETLINK answers");
                                        }
                                        return -1;
@@ -375,12 +379,12 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
                        }
 
                        if (h->nlmsg_type == NLMSG_ERROR) {
-                               struct nlmsgerr *err =
+                               struct nlmsgerr *merr =
                                        (struct nlmsgerr *)NLMSG_DATA(h);
                                if (l < (int)sizeof(struct nlmsgerr)) {
                                        fprintf(stderr, "ERROR truncated\n");
                                } else {
-                                       errno = -err->error;
+                                       errno = -merr->error;
                                        if (errno == 0) {
                                                if (answer)
                                                        memcpy(answer, h,
@@ -489,7 +493,6 @@ int rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg)
 
 int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler, void *jarg)
 {
-       int status;
        struct sockaddr_nl nladdr;
        char buf[8192];
        struct nlmsghdr *h = (void *)buf;
@@ -500,37 +503,43 @@ int rtnl_from_file(FILE *rtnl, rtnl_filter_t handler, void *jarg)
        nladdr.nl_groups = 0;
 
        while (1) {
-               int err, len;
-               int l;
+               int err;
+               size_t l, rl, arl;
 
-               status = fread(&buf, 1, sizeof(*h), rtnl);
+               rl = sizeof(*h);
+               arl = fread(&buf, 1, rl, rtnl);
 
-               if (status < 0) {
-                       if (errno == EINTR)
-                               continue;
-                       perror("rtnl_from_file: fread");
+               if (arl != rl) {
+                       if (arl == 0)
+                               return 0;
+
+                       if (ferror(rtnl))
+                               fprintf(stderr, "%s: header read failed\n",
+                                       __func__);
+                       else
+                               fprintf(stderr, "%s: truncated header\n",
+                                       __func__);
                        return -1;
                }
-               if (status == 0)
-                       return 0;
 
-               len = h->nlmsg_len;
-               l = len - sizeof(*h);
+               l = h->nlmsg_len > rl ? h->nlmsg_len - rl : 0;
 
-               if (l < 0 || len > (int)sizeof(buf)) {
-                       fprintf(stderr, "!!!malformed message: len=%d @%lu\n",
-                               len, ftell(rtnl));
+               if (l == 0 || (l + (size_t)NLMSG_HDRLEN) > sizeof(buf)) {
+                       fprintf(stderr, "%s: malformed message: len=%zu @%lu\n",
+                               __func__, (size_t)h->nlmsg_len, ftell(rtnl));
                        return -1;
                }
 
-               status = fread(NLMSG_DATA(h), 1, NLMSG_ALIGN(l), rtnl);
+               rl = NLMSG_ALIGN(l);
+               arl = fread(NLMSG_DATA(h), 1, rl, rtnl);
 
-               if (status < 0) {
-                       perror("rtnl_from_file: fread");
-                       return -1;
-               }
-               if (status < l) {
-                       fprintf(stderr, "rtnl-from_file: truncated message\n");
+               if (arl != rl) {
+                       if (ferror(rtnl))
+                               fprintf(stderr, "%s: msg read failed\n",
+                                       __func__);
+                       else
+                               fprintf(stderr, "%s: truncated message\n",
+                                       __func__);
                        return -1;
                }