Currently struct aspath is defined with a placeholder for the dynamic data
part.
struct aspath {
        LIST_ENTRY(aspath)      entry;
        int                     refcnt; /* reference count */
        u_int16_t               len;    /* total length of aspath in octets */
        u_int16_t               ascnt;  /* number of AS hops in data */
        u_char                  data[1]; /* placeholder for actual data */
};

The size of the struct - this placeholder was calculated as
ASPATH_HEADER_SIZE using (sizeof(struct aspath) - sizeof(u_char)).
Now that does not consider any padding bytes added. Instead this should
use offsetof(struct aspath, data) so that the malloc does not allocate too
much memory.

-- 
:wq Claudio

Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
retrieving revision 1.198
diff -u -p -r1.198 rde.h
--- rde.h       24 Oct 2018 08:26:37 -0000      1.198
+++ rde.h       25 Oct 2018 08:48:38 -0000
@@ -23,6 +23,7 @@
 #include <sys/queue.h>
 #include <sys/tree.h>
 #include <stdint.h>
+#include <stddef.h>
 
 #include "bgpd.h"
 #include "log.h"
@@ -125,7 +126,7 @@ struct rde_peer {
 #define AS_SEQUENCE            2
 #define AS_CONFED_SEQUENCE     3
 #define AS_CONFED_SET          4
-#define ASPATH_HEADER_SIZE     (sizeof(struct aspath) - sizeof(u_char))
+#define ASPATH_HEADER_SIZE     (offsetof(struct aspath, data))
 
 struct aspath {
        LIST_ENTRY(aspath)      entry;

Reply via email to