(1) Fix memory leak by connections from <UNKNOWN>.

(2) Take care of large counters on 64bit platforms.

PR:		ports/78807 (1)
Submitted by:	Andriy Gapon <avg@icyb.net.ua> (1),
		Peter Losher <Peter_Losher@isc.org> (2)
Approved by:	portmgr (marcus)
This commit is contained in:
Jun Kuriyama 2005-03-22 08:32:48 +00:00
parent d87abb1b71
commit a3597c82c2
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=131884
9 changed files with 177 additions and 9 deletions

View file

@ -7,7 +7,7 @@
PORTNAME= snmp
PORTVERSION= 5.2.1
PORTREVISION= 0
PORTREVISION= 1
PKGNAMEPREFIX= net-
CATEGORIES= net-mgmt ipv6
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}

View file

@ -1,5 +1,5 @@
--- snmplib/asn1.c.orig Tue Jan 25 10:09:35 2005
+++ snmplib/asn1.c Tue Jan 25 10:09:55 2005
--- snmplib/asn1.c.orig.2 Sat Dec 11 00:07:16 2004
+++ snmplib/asn1.c Thu Feb 24 23:42:30 2005
@@ -181,6 +181,9 @@
#include <in.h>
#endif
@ -10,3 +10,49 @@
#if HAVE_DMALLOC_H
#include <dmalloc.h>
#endif
@@ -584,6 +587,11 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
/*
* Truncate "unnecessary" bytes off of the most significant end of this
* 2's complement integer. There should be no sequence of 9
@@ -663,6 +671,9 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ integer &= 0xffffffff;
+ }
mask = ((u_long) 0xFF) << (8 * (sizeof(long) - 1));
/*
* mask is 0xFF000000 on a big-endian machine
@@ -2674,6 +2685,12 @@
return 0;
}
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
+
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {
return 0;
}
@@ -2823,6 +2840,10 @@
if (intsize != sizeof(unsigned long)) {
_asn_size_err(errpre, intsize, sizeof(unsigned long));
return 0;
+ }
+
+ if (intsize > 4) {
+ integer &= 0xffffffff;
}
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {

View file

@ -0,0 +1,10 @@
--- agent/snmp_agent.c.orig Tue Mar 22 11:11:51 2005
+++ agent/snmp_agent.c Tue Mar 22 11:12:29 2005
@@ -825,6 +825,7 @@
return 0;
}
} else {
+ SNMP_FREE(addr_string);
if (hosts_ctl("snmpd", STRING_UNKNOWN, STRING_UNKNOWN, STRING_UNKNOWN)){
snmp_log(allow_severity, "Connection from <UNKNOWN>\n");
addr_string = strdup("<UNKNOWN>");

View file

@ -7,7 +7,7 @@
PORTNAME= snmp
PORTVERSION= 5.2.1
PORTREVISION= 0
PORTREVISION= 1
PKGNAMEPREFIX= net-
CATEGORIES= net-mgmt ipv6
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}

View file

@ -1,5 +1,5 @@
--- snmplib/asn1.c.orig Tue Jan 25 10:09:35 2005
+++ snmplib/asn1.c Tue Jan 25 10:09:55 2005
--- snmplib/asn1.c.orig.2 Sat Dec 11 00:07:16 2004
+++ snmplib/asn1.c Thu Feb 24 23:42:30 2005
@@ -181,6 +181,9 @@
#include <in.h>
#endif
@ -10,3 +10,49 @@
#if HAVE_DMALLOC_H
#include <dmalloc.h>
#endif
@@ -584,6 +587,11 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
/*
* Truncate "unnecessary" bytes off of the most significant end of this
* 2's complement integer. There should be no sequence of 9
@@ -663,6 +671,9 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ integer &= 0xffffffff;
+ }
mask = ((u_long) 0xFF) << (8 * (sizeof(long) - 1));
/*
* mask is 0xFF000000 on a big-endian machine
@@ -2674,6 +2685,12 @@
return 0;
}
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
+
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {
return 0;
}
@@ -2823,6 +2840,10 @@
if (intsize != sizeof(unsigned long)) {
_asn_size_err(errpre, intsize, sizeof(unsigned long));
return 0;
+ }
+
+ if (intsize > 4) {
+ integer &= 0xffffffff;
}
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {

View file

@ -0,0 +1,10 @@
--- agent/snmp_agent.c.orig Tue Mar 22 11:11:51 2005
+++ agent/snmp_agent.c Tue Mar 22 11:12:29 2005
@@ -825,6 +825,7 @@
return 0;
}
} else {
+ SNMP_FREE(addr_string);
if (hosts_ctl("snmpd", STRING_UNKNOWN, STRING_UNKNOWN, STRING_UNKNOWN)){
snmp_log(allow_severity, "Connection from <UNKNOWN>\n");
addr_string = strdup("<UNKNOWN>");

View file

@ -7,7 +7,7 @@
PORTNAME= snmp
PORTVERSION= 5.2.1
PORTREVISION= 0
PORTREVISION= 1
PKGNAMEPREFIX= net-
CATEGORIES= net-mgmt ipv6
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}

View file

@ -1,5 +1,5 @@
--- snmplib/asn1.c.orig Tue Jan 25 10:09:35 2005
+++ snmplib/asn1.c Tue Jan 25 10:09:55 2005
--- snmplib/asn1.c.orig.2 Sat Dec 11 00:07:16 2004
+++ snmplib/asn1.c Thu Feb 24 23:42:30 2005
@@ -181,6 +181,9 @@
#include <in.h>
#endif
@ -10,3 +10,49 @@
#if HAVE_DMALLOC_H
#include <dmalloc.h>
#endif
@@ -584,6 +587,11 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
/*
* Truncate "unnecessary" bytes off of the most significant end of this
* 2's complement integer. There should be no sequence of 9
@@ -663,6 +671,9 @@
return NULL;
}
integer = *intp;
+ if (intsize > 4) {
+ integer &= 0xffffffff;
+ }
mask = ((u_long) 0xFF) << (8 * (sizeof(long) - 1));
/*
* mask is 0xFF000000 on a big-endian machine
@@ -2674,6 +2685,12 @@
return 0;
}
+ if (intsize > 4) {
+ register u_long signmask = ((u_long)1 << ((8 * sizeof(long)) - 1));
+ register u_long signbit = ((integer & signmask) != 0);
+ integer &= (signbit << 31) | 0x7fffffff;
+ }
+
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {
return 0;
}
@@ -2823,6 +2840,10 @@
if (intsize != sizeof(unsigned long)) {
_asn_size_err(errpre, intsize, sizeof(unsigned long));
return 0;
+ }
+
+ if (intsize > 4) {
+ integer &= 0xffffffff;
}
if (((*pkt_len - *offset) < 1) && !(r && asn_realloc(pkt, pkt_len))) {

View file

@ -0,0 +1,10 @@
--- agent/snmp_agent.c.orig Tue Mar 22 11:11:51 2005
+++ agent/snmp_agent.c Tue Mar 22 11:12:29 2005
@@ -825,6 +825,7 @@
return 0;
}
} else {
+ SNMP_FREE(addr_string);
if (hosts_ctl("snmpd", STRING_UNKNOWN, STRING_UNKNOWN, STRING_UNKNOWN)){
snmp_log(allow_severity, "Connection from <UNKNOWN>\n");
addr_string = strdup("<UNKNOWN>");