]> git.puffer.fish Git - mirror/frr.git/commitdiff
2004-01-08 Greg Troxel <gdt@fnord.ir.bbn.com>
authorgdt <gdt>
Thu, 8 Jan 2004 15:44:29 +0000 (15:44 +0000)
committergdt <gdt>
Thu, 8 Jan 2004 15:44:29 +0000 (15:44 +0000)
        * kernel_socket.c (kernel_read): Use sockaddr_storage in buffer
        for reading kernel messages to ensure enough space (necessary on
        Solaris due to sockaddr_dl being large).  Thanks to Sowmini
        Varadhan for help with this change.

zebra/ChangeLog
zebra/kernel_socket.c

index 6cae04bd0d09a6775256d7f51d627b67c008a687..8256c1ccc6bec25217d8286c7a6f2eac3ce27a4e 100644 (file)
@@ -1,3 +1,10 @@
+2004-01-08  Greg Troxel  <gdt@fnord.ir.bbn.com>
+
+       * kernel_socket.c (kernel_read): Use sockaddr_storage in buffer
+       for reading kernel messages to ensure enough space (necessary on
+       Solaris due to sockaddr_dl being large).  Thanks to Sowmini
+       Varadhan for help with this change.
+
 2004-01-06  Greg Troxel  <gdt@t1.ir.bbn.com>
 
        * rtadv.c (rtadv_send_packet): Change perror to zlog_err.
index b8dfcc7d379d6ce4b23b83291617432c62d8ffc5..9dd261572f8bc66dbd6174f93110f7a6ae0179a3 100644 (file)
@@ -849,10 +849,12 @@ kernel_read (struct thread *thread)
 
   /*
    * This must be big enough for any message the kernel might send.
-   * The code previously used RTAX_MAX struct sockaddrs in all cases,
-   * but now that sockaddrs are variable size, this doesn't work
-   * (Solaris has 244 bytes of sdl_data!).  For now, add a struct
-   * sockaddr_dl to the case where it is used.
+   * Rather than determining how many sockaddrs of what size might be
+   * in each particular message, just use RTAX_MAX of sockaddr_storage
+   * for each.  Note that the sockaddrs must be after each message
+   * definition, or rather after whichever happens to be the largest,
+   * since the buffer needs to be big enough for a message and the
+   * sockaddrs together.
    */
   union 
   {
@@ -860,22 +862,21 @@ kernel_read (struct thread *thread)
     struct 
     {
       struct rt_msghdr rtm;
-      struct sockaddr addr[RTAX_MAX];
+      struct sockaddr_storage addr[RTAX_MAX];
     } r;
 
     /* Interface information. */
     struct
     {
       struct if_msghdr ifm;
-      struct sockaddr_dl;
-      struct sockaddr addr[RTAX_MAX-1];
+      struct sockaddr_storage addr[RTAX_MAX];
     } im;
 
     /* Interface address information. */
     struct
     {
       struct ifa_msghdr ifa;
-      struct sockaddr addr[RTAX_MAX];
+      struct sockaddr_storage addr[RTAX_MAX];
     } ia;
 
 #ifdef RTM_IFANNOUNCE
@@ -883,7 +884,7 @@ kernel_read (struct thread *thread)
     struct
     {
       struct if_announcemsghdr ifan;
-      struct sockaddr addr[RTAX_MAX];
+      struct sockaddr_storage addr[RTAX_MAX];
     } ian;
 #endif /* RTM_IFANNOUNCE */
 
@@ -908,6 +909,10 @@ kernel_read (struct thread *thread)
 
   rtm = &buf.r.rtm;
 
+  /*
+   * Ensure that we didn't drop any data, so that processing routines
+   * can assume they have the whole message.
+   */
   if (rtm->rtm_msglen != nbytes)
     {
       zlog_warn ("kernel_read: rtm->rtm_msglen %d, nbytes %d, type %d\n",