]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: fix FreeBSD warning on fresh OS boot
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 8 Jan 2019 12:32:28 +0000 (10:32 -0200)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 8 Jan 2019 12:32:28 +0000 (10:32 -0200)
Handle corner case where a warning log message is issued on interface
address netmask handling with sockaddr type AF_LINK: it may come empty
or with match all (all 0xFF).

In the first case all lengths are zero and we only need to copy the
first bytes, second case it comes with a zero index and all 0xFF bytes.

In any case we only need to figure out a few of the first bytes instead
of all data.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
zebra/kernel_socket.c

index 1f82c1d591c1a4065a0044edafb69666a677b0e8..29d2b1f45f92fc8b2e139d81f3479306f124a971 100644 (file)
@@ -250,6 +250,7 @@ static inline int af_check(int family)
 size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf)
 {
        struct sockaddr *sa = (struct sockaddr *)sap;
+       struct sockaddr_dl *sdl;
        uint8_t *dest = destp;
        size_t tlen, copylen;
 
@@ -263,6 +264,17 @@ size_t _rta_get(caddr_t sap, void *destp, size_t destlen, bool checkaf)
        if (copylen > 0 && dest != NULL) {
                if (checkaf && af_check(sa->sa_family) == 0)
                        return tlen;
+               /*
+                * Handle sockaddr_dl corner case:
+                * RTA_NETMASK might be AF_LINK, but it doesn't anything
+                * relevant (e.g. zeroed out fields). Check for this
+                * case and avoid warning log message.
+                */
+               if (sa->sa_family == AF_LINK) {
+                       sdl = (struct sockaddr_dl *)sa;
+                       if (sdl->sdl_index == 0 || sdl->sdl_nlen == 0)
+                               copylen = sizeof(*sdl) - sizeof(sdl->sdl_data);
+               }
 
                if (copylen > destlen) {
                        zlog_warn("%s: destination buffer too small (%lu vs %lu)",