Date: Thu, 31 Jul 2014 18:31:01 GMT From: shonali@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r271653 - soc2014/shonali/head/contrib/bsnmp/snmpd Message-ID: <201407311831.s6VIV1OB066373@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407311831.s6VIV1OB066373>