7-Jun-2004 Mike Slifcak This patch fixes a problem with a non-existent structure member seen during a build on FreeBSD 5.x platform.
Builds on FreeBSD 4.x and FreeBSD 5.x are affected. Note the memcpy near line 612. The intent is to address one element in a large array for the purpose of copying it to the nnew buffer. Did the original memcpy work correctly ?? More importantly, would the new memcpy suffice ? If FreeBSD 4.9-RELEASE builds clean with this patch, I would like to incorporate it into the V5-1-patches and main CVS branches. Best Regards, -Mike Slifcak --- net-snmp-5.1.1/agent/mibgroup/mibII/udpTable.c 2004-04-07 00:59:27.000000000 -0400 +++ net-snmp/agent/mibgroup/mibII/udpTable.c 2004-06-08 00:20:41.617629952 -0400 @@ -65,9 +65,22 @@ #ifdef linux #define INP_NEXT_SYMBOL inp_next #endif + +#ifdef freebsd4 +typedef struct netsnmp_inpcb_s netsnmp_inpcb; +struct netsnmp_inpcb_s { + struct inpcb pcb; + int state; + netsnmp_inpcb *inp_next; +}; +#define UDPTABLE_ENTRY_TYPE netsnmp_inpcb +#define UDPTABLE_LOCALADDRESS pcb.inp_laddr.s_addr +#define UDPTABLE_LOCALPORT pcb.inp_lport +#else #define UDPTABLE_ENTRY_TYPE struct inpcb #define UDPTABLE_LOCALADDRESS inp_laddr.s_addr #define UDPTABLE_LOCALPORT inp_lport +#endif #define UDPTABLE_IS_LINKED_LIST #endif /* WIN32 */ @@ -583,7 +596,7 @@ int sname[] = { CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_PCBLIST }; char *udpcb_buf = NULL; struct xinpgen *xig = NULL; - struct inpcb *nnew; + UDPTABLE_ENTRY_TYPE *nnew; udpTable_free(NULL, NULL); @@ -607,12 +620,17 @@ xig = (struct xinpgen *) ((char *) xig + xig->xig_len); while (xig && (xig->xig_len > sizeof(struct xinpgen))) { - nnew = SNMP_MALLOC_TYPEDEF(struct inpcb); + nnew = SNMP_MALLOC_TYPEDEF(UDPTABLE_ENTRY_TYPE); if (!nnew) break; +#ifdef freebsd4 + memcpy(nnew, &((struct xinpcb *) xig)->xi_inp, sizeof(struct inpcb)); + nnew->inp_next = udp_head; +#else memcpy(nnew, ((struct xinpcb *) xig)->xi_inp, sizeof(struct inpcb)); - nnew->next = udp_head; /* XXX - ?? Check 'next' pointer */ +#endif + udp_head = nnew; xig = (struct xinpgen *) ((char *) xig + xig->xig_len); }