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;