socsvn commit: r271653 - soc2014/shonali/head/contrib/bsnmp/snmpd
shonali at FreeBSD.org
shonali at FreeBSD.org
Thu Jul 31 18:31:02 UTC 2014
Author: shonali
Date: Thu Jul 31 18:31:01 2014
New Revision: 271653
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271653
Log:
Added fixes to config.c, export.c and trans_udpv6.c.
Modified:
soc2014/shonali/head/contrib/bsnmp/snmpd/config.c
soc2014/shonali/head/contrib/bsnmp/snmpd/export.c
soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c
Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/config.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/config.c Thu Jul 31 17:18:40 2014 (r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/config.c Thu Jul 31 18:31:01 2014 (r271653)
@@ -791,63 +791,67 @@
report("%s: %s", host, gai_strerror(error));
if (res == NULL)
report("%s: unknown hostname", host);
+
+ switch (res->ai_family) {
- if(res->ai_family == AF_INET) {
- addr_type = AF_INET;
- struct sockaddr_in *sain ;
- sain = (struct sockaddr_in *)(void *)res->ai_addr;
- sain->sin_addr.s_addr = ntohl(sain->sin_addr.s_addr);
+ case AF_INET :
+ addr_type = AF_INET;
+ struct sockaddr_in *sain ;
+ sain = (struct sockaddr_in *)(void *)res->ai_addr;
+ sain->sin_addr.s_addr = ntohl(sain->sin_addr.s_addr);
- ip[0] = sain->sin_addr.s_addr >> 24;
- ip[1] = sain->sin_addr.s_addr >> 16;
- ip[2] = sain->sin_addr.s_addr >> 8;
- ip[3] = sain->sin_addr.s_addr >> 0;
- }
- else if(res->ai_family == AF_INET6) {
-
- addr_type = AF_INET6;
- struct sockaddr_in6 *sain ;
- sain = (struct sockaddr_in6 *)(void *)res->ai_addr;
- unsigned char tmp[16];
+ ip[0] = sain->sin_addr.s_addr >> 24;
+ ip[1] = sain->sin_addr.s_addr >> 16;
+ ip[2] = sain->sin_addr.s_addr >> 8;
+ ip[3] = sain->sin_addr.s_addr >> 0;
+
+ case AF_INET6 :
+ addr_type = AF_INET6;
+ struct sockaddr_in6 *sain ;
+ sain = (struct sockaddr_in6 *)(void *)res->ai_addr;
+ unsigned char tmp[16];
- /* ipv6 implementation of network to host byte order function */
- /* May be unnecessary - check */
- if (BYTE_ORDER == LITTLE_ENDIAN) {
- tmp[3] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
- tmp[2] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
- tmp[1] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
- tmp[0] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
- }
-
- else {
- tmp[0] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
- tmp[1] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
- tmp[2] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
- tmp[3] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
- }
+ /* ipv6 implementation of network to host byte order function */
+ /* May be unnecessary - check */
+ if (BYTE_ORDER == LITTLE_ENDIAN) {
+ tmp[3] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
+ tmp[2] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
+ tmp[1] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
+ tmp[0] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
+ }
+
+ else {
+ tmp[0] = (sain->sin6_addr.s6_addr[0] << 24) | (sain->sin6_addr.s6_addr[1] << 16) | (sain->sin6_addr.s6_addr[2] << 8) | sain->sin6_addr.s6_addr[3];
+ tmp[1] = (sain->sin6_addr.s6_addr[4] << 24) | (sain->sin6_addr.s6_addr[5] << 16) | (sain->sin6_addr.s6_addr[6] << 8) | sain->sin6_addr.s6_addr[7];
+ tmp[2] = (sain->sin6_addr.s6_addr[8] << 24) | (sain->sin6_addr.s6_addr[9] << 16) | (sain->sin6_addr.s6_addr[10] << 8) | sain->sin6_addr.s6_addr[11];
+ tmp[3] = (sain->sin6_addr.s6_addr[12] << 24) | (sain->sin6_addr.s6_addr[13] << 16) | (sain->sin6_addr.s6_addr[14] << 8) | sain->sin6_addr.s6_addr[15];
+ }
- strcpy(sain->sin6_addr.s6_addr, (unsigned char *)tmp) ;
- inet_ntop(AF_INET6, &(sain->sin6_addr), *ip, INET6_ADDRSTRLEN);
+ strcpy(sain->sin6_addr.s6_addr, (unsigned char *)tmp) ;
+ inet_ntop(AF_INET6, &(sain->sin6_addr), *ip, INET6_ADDRSTRLEN);
+
+ /* incase inet_ntop doesn't work as expected
+ ip[0] = sain->sin6_addr.s6_addr >> 120;
+ ip[1] = sain->sin6_addr.s6_addr >> 112;
+ ip[2] = sain->sin6_addr.s6_addr >> 104;
+ ip[3] = sain->sin6_addr.s6_addr >> 96;
+ ip[4] = sain->sin6_addr.s6_addr >> 88;
+ ip[5] = sain->sin6_addr.s6_addr >> 80;
+ ip[6] = sain->sin6_addr.s6_addr >> 72;
+ ip[7] = sain->sin6_addr.s6_addr >> 64;
+ ip[8] = sain->sin6_addr.s6_addr >> 56;
+ ip[9] = sain->sin6_addr.s6_addr >> 48;
+ ip[10] = sain->sin6_addr.s6_addr >> 40;
+ ip[11] = sain->sin6_addr.s6_addr >> 32;
+ ip[12] = sain->sin6_addr.s6_addr >> 24;
+ ip[13] = sain->sin6_addr.s6_addr >> 16;
+ ip[14] = sain->sin6_addr.s6_addr >> 8;
+ ip[15] = sain->sin6_addr.s6_addr >> 0;
+ */
- /* incase inet_ntop doesn't work as expected
- ip[0] = sain->sin6_addr.s6_addr >> 120;
- ip[1] = sain->sin6_addr.s6_addr >> 112;
- ip[2] = sain->sin6_addr.s6_addr >> 104;
- ip[3] = sain->sin6_addr.s6_addr >> 96;
- ip[4] = sain->sin6_addr.s6_addr >> 88;
- ip[5] = sain->sin6_addr.s6_addr >> 80;
- ip[6] = sain->sin6_addr.s6_addr >> 72;
- ip[7] = sain->sin6_addr.s6_addr >> 64;
- ip[8] = sain->sin6_addr.s6_addr >> 56;
- ip[9] = sain->sin6_addr.s6_addr >> 48;
- ip[10] = sain->sin6_addr.s6_addr >> 40;
- ip[11] = sain->sin6_addr.s6_addr >> 32;
- ip[12] = sain->sin6_addr.s6_addr >> 24;
- ip[13] = sain->sin6_addr.s6_addr >> 16;
- ip[14] = sain->sin6_addr.s6_addr >> 8;
- ip[15] = sain->sin6_addr.s6_addr >> 0;
- */
- }
+ default:
+ return (NULL);
+ }
freeaddrinfo(res);
}
@@ -860,7 +864,7 @@
{
struct snmp_node *node;
u_int i;
- u_char ip[4];
+ u_char ip[16];
struct asn_oid str_oid;
for (node = tree; node < &tree[tree_size]; node++)
@@ -901,15 +905,18 @@
} else if (token == TOK_HOST) {
gethost(strval, ip);
- if (oid->len + 16 > ASN_MAXOIDLEN)
- report("index too long");
+
if (addr_type == AF_INET){
+ if (oid->len + 4 > ASN_MAXOIDLEN)
+ report("index too long");
for (i = 0; i < 4; i++)
oid->subs[oid->len++] = ip[i];
gettoken();
}
if (addr_type == AF_INET6){
+ if (oid->len + 16 > ASN_MAXOIDLEN)
+ report("index too long");
for (i = 0; i < 16; i++)
oid->subs[oid->len++] = ip[i];
gettoken();
@@ -1030,41 +1037,41 @@
parse_syntax_ipaddress(struct snmp_value *value)
{
int i;
- u_char ip[4];
+ u_char ip[16];
if (token == TOK_NUM) {
/* numerical address */
i = 0;
for (;;) {
if (!isxdigit(numval)) {
- if (numval >= 256)
- report("ip address part too large");
- value->v.ipaddress[i++] = numval;
- if (i == 4)
- break;
- if (gettoken() != '.')
- report("expecting '.' in ip address");
- }
- else {
- value->v.ipaddress[i++] = numval;
- if (i == 16)
- break;
- if (gettoken() != ':')
- report("expecting ':' in ip address");
- }
+ if (numval >= 256)
+ report("ip address part too large");
+ value->v.ipaddress[i++] = numval;
+ if (i == 4)
+ break;
+ if (gettoken() != '.')
+ report("expecting '.' in ip address");
+ }
+
+ else {
+ value->v.ipaddress[i++] = numval;
+ if (i == 16)
+ break;
+ if (gettoken() != ':')
+ report("expecting ':' in ip address");
+ }
}
gettoken();
if (i == 4) {
- struct in_addr dst;
- if (!inet_pton(AF_INET,value->v.ipaddress[i++],(void *)&dst))
- report("ip address not valid");
+ struct in_addr dst;
+ if (!inet_pton(AF_INET,value->v.ipaddress[i++],(void *)&dst))
+ report("ip address not valid");
}
else if (i == 16) {
- struct in6_addr dst;
- if (!inet_pton(AF_INET6,value->v.ipaddress[i++],(void *)&dst))
- report("ipv6 address not valid");
-
+ struct in6_addr dst;
+ if (!inet_pton(AF_INET6,value->v.ipaddress[i++],(void *)&dst))
+ report("ipv6 address not valid");
}
} else if (token == TOK_HOST) {
Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/export.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/export.c Thu Jul 31 17:18:40 2014 (r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/export.c Thu Jul 31 18:31:01 2014 (r271653)
@@ -152,37 +152,41 @@
*/
int
ip_save(struct snmp_value *value, struct snmp_context *ctx, u_char *valp)
-{
+{
+ /* XX - sizeof of a pointer to an array doesn't give you size of array
+ Need to find a fix to this or a new way of finding address type */
+
if (sizeof(*valp)== 4) {
- ctx->scratch->int1 = (valp[0] << 24) | (valp[1] << 16) | (valp[2] << 8)
- | valp[3];
+ ctx->scratch->int1 = (valp[0] << 24) | (valp[1] << 16) | (valp[2] << 8)
+ | valp[3];
- valp[0] = value->v.ipaddress[0];
- valp[1] = value->v.ipaddress[1];
- valp[2] = value->v.ipaddress[2];
- valp[3] = value->v.ipaddress[3];
+ valp[0] = value->v.ipaddress[0];
+ valp[1] = value->v.ipaddress[1];
+ valp[2] = value->v.ipaddress[2];
+ valp[3] = value->v.ipaddress[3];
}
if (sizeof(*valp)== 16) {
- ctx->scratch->int1 = (valp[0] << 120) | (valp[1] << 112) | (valp[2] << 104) | (valp[3] << 96) | (valp[4] << 88) | (valp[5] << 80) | (valp[6] << 72) | (valp[7] << 64) | (valp[8] << 56) |
- (valp[9] << 48) | (valp[10] << 40) | (valp[11] << 32) | (valp[12] << 24) | (valp[13] << 16) | (valp[14] << 8) | valp[15];
-
- valp[0] = value->v.ipaddress[0];
- valp[1] = value->v.ipaddress[1];
- valp[2] = value->v.ipaddress[2];
- valp[3] = value->v.ipaddress[3];
- valp[4] = value->v.ipaddress[4];
- valp[5] = value->v.ipaddress[5];
- valp[6] = value->v.ipaddress[6];
- valp[7] = value->v.ipaddress[7];
- valp[8] = value->v.ipaddress[8];
- valp[9] = value->v.ipaddress[9];
- valp[10] = value->v.ipaddress[10];
- valp[11] = value->v.ipaddress[11];
- valp[12] = value->v.ipaddress[12];
- valp[13] = value->v.ipaddress[13];
- valp[14] = value->v.ipaddress[14];
- valp[15] = value->v.ipaddress[15];
+ ctx->scratch->int1 = (valp[0] << 120) | (valp[1] << 112) | (valp[2] << 104) | (valp[3] << 96) | (valp[4] << 88) |
+ (valp[5] << 80) | (valp[6] << 72) | (valp[7] << 64) | (valp[8] << 56) | (valp[9] << 48) | (valp[10] << 40) |
+ (valp[11] << 32) | (valp[12] << 24) | (valp[13] << 16) | (valp[14] << 8) | valp[15];
+
+ valp[0] = value->v.ipaddress6[0];
+ valp[1] = value->v.ipaddress6[1];
+ valp[2] = value->v.ipaddress6[2];
+ valp[3] = value->v.ipaddress6[3];
+ valp[4] = value->v.ipaddress6[4];
+ valp[5] = value->v.ipaddress6[5];
+ valp[6] = value->v.ipaddress6[6];
+ valp[7] = value->v.ipaddress6[7];
+ valp[8] = value->v.ipaddress6[8];
+ valp[9] = value->v.ipaddress6[9];
+ valp[10] = value->v.ipaddress6[10];
+ valp[11] = value->v.ipaddress6[11];
+ valp[12] = value->v.ipaddress6[12];
+ valp[13] = value->v.ipaddress6[13];
+ valp[14] = value->v.ipaddress6[14];
+ valp[15] = value->v.ipaddress6[15];
}
@@ -194,7 +198,11 @@
*/
void
ip_rollback(struct snmp_context *ctx, u_char *valp)
-{ if (sizeof(*valp)== 4) {
+{
+ /* XX - sizeof of a pointer to an array doesn't give you size of array
+ Need to find a fix to this or a new way of finding address type */
+
+ if (sizeof(*valp)== 4) {
valp[0] = ctx->scratch->int1 >> 24;
valp[1] = ctx->scratch->int1 >> 16;
valp[2] = ctx->scratch->int1 >> 8;
@@ -234,29 +242,33 @@
int
ip_get(struct snmp_value *value, u_char *valp)
{
+ /* XX - sizeof of a pointer to an array doesn't give you size of array
+ Need to find a fix to this or a new way of finding address type */
+
if (sizeof(*valp)== 4) {
- value->v.ipaddress[0] = valp[0];
- value->v.ipaddress[1] = valp[1];
- value->v.ipaddress[2] = valp[2];
- value->v.ipaddress[3] = valp[3];
+ value->v.ipaddress[0] = valp[0];
+ value->v.ipaddress[1] = valp[1];
+ value->v.ipaddress[2] = valp[2];
+ value->v.ipaddress[3] = valp[3];
}
+
if (sizeof(*valp)== 16) {
- value->v.ipaddress[0] = valp[0];
- value->v.ipaddress[1] = valp[1];
- value->v.ipaddress[2] = valp[2];
- value->v.ipaddress[3] = valp[3];
- value->v.ipaddress[4] = valp[4];
- value->v.ipaddress[5] = valp[5];
- value->v.ipaddress[6] = valp[6];
- value->v.ipaddress[7] = valp[7];
- value->v.ipaddress[8] = valp[8];
- value->v.ipaddress[9] = valp[9];
- value->v.ipaddress[10] = valp[10];
- value->v.ipaddress[11] = valp[11];
- value->v.ipaddress[12] = valp[12];
- value->v.ipaddress[13] = valp[13];
- value->v.ipaddress[14] = valp[14];
- value->v.ipaddress[15] = valp[15];
+ value->v.ipaddress6[0] = valp[0];
+ value->v.ipaddress6[1] = valp[1];
+ value->v.ipaddress6[2] = valp[2];
+ value->v.ipaddress6[3] = valp[3];
+ value->v.ipaddress6[4] = valp[4];
+ value->v.ipaddress6[5] = valp[5];
+ value->v.ipaddress6[6] = valp[6];
+ value->v.ipaddress6[7] = valp[7];
+ value->v.ipaddress6[8] = valp[8];
+ value->v.ipaddress6[9] = valp[9];
+ value->v.ipaddress6[10] = valp[10];
+ value->v.ipaddress6[11] = valp[11];
+ value->v.ipaddress6[12] = valp[12];
+ value->v.ipaddress6[13] = valp[13];
+ value->v.ipaddress6[14] = valp[14];
+ value->v.ipaddress6[15] = valp[15];
}
return (SNMP_ERR_NOERROR);
Modified: soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c
==============================================================================
--- soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Thu Jul 31 17:18:40 2014 (r271652)
+++ soc2014/shonali/head/contrib/bsnmp/snmpd/trans_udpv6.c Thu Jul 31 18:31:01 2014 (r271653)
@@ -104,7 +104,7 @@
{
struct udpv6_port *p = (struct udpv6_port *)tp;
struct sockaddr_in6 addr;
- u_int32_t ip[4];
+ u_int8_t ip[16];
const int on = 1;
char str[INET6_ADDRSTRLEN];
@@ -113,10 +113,22 @@
return (SNMP_ERR_RES_UNAVAIL);
}
- ip[0] = htonl((p->addr[0] << 24) | (p->addr[1] << 16) | (p->addr[2] << 8) | p->addr[3]);
- ip[1] = htonl((p->addr[4] << 24) | (p->addr[5] << 16) | (p->addr[6] << 8) | p->addr[7]);
- ip[2] = htonl((p->addr[8] << 24) | (p->addr[9] << 16) | (p->addr[10] << 8) | p->addr[11]);
- ip[3] = htonl((p->addr[12] << 24) | (p->addr[13] << 16) | (p->addr[14] << 8) | p->addr[15]);
+ ip[0] = p->addr[0] >> 120;
+ ip[1] = p->addr[1] >> 112;
+ ip[2] = p->addr[2] >> 104;
+ ip[3] = p->addr[3] >> 96;
+ ip[4] = p->addr[4] >> 88;
+ ip[5] = p->addr[5] >> 80;
+ ip[6] = p->addr[6] >> 72;
+ ip[7] = p->addr[7] >> 64;
+ ip[8] = p->addr[8] >> 56;
+ ip[9] = p->addr[9] >> 48;
+ ip[10] = p->addr[10] >> 40;
+ ip[11] = p->addr[11] >> 32;
+ ip[12] = p->addr[12] >> 24;
+ ip[13] = p->addr[13] >> 16;
+ ip[14] = p->addr[14] >> 8;
+ ip[15] = p->addr[15] >> 0;
/* Need to check - can use getaddrinfo instead to fill up addr structure */
memset(&addr, 0, sizeof(addr));
@@ -125,7 +137,7 @@
addr.sin6_family = AF_INET6;
addr.sin6_len = sizeof(addr);
if ((addr.sin6_addr.s6_addr == in6addr_any.s6_addr) &&
- ( setsockopt(p->input.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
+ ( setsockopt(p->input.fd, IPPROTO_IPV6, IPV6_V6ONLY, &on,
sizeof(on)) == -1)) {
syslog(LOG_ERR, "setsockopt(IP_RECVDSTADDR): %m");
close(p->input.fd);
More information about the svn-soc-all
mailing list