Date: Thu, 8 Sep 2005 18:38:32 GMT From: Victor Cruceru <soc-victor@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 83275 for review Message-ID: <200509081838.j88IcWgs059875@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=83275 Change 83275 by soc-victor@soc-victor_82.76.158.176 on 2005/09/08 18:38:30 Fixed an ugly bug in OID index encoding (for INET-ADDRESS-MIB TCs) for both TCP and UDP MIBs. Affected files ... .. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/tcp46_snmp.c#8 edit .. //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#8 edit Differences ... ==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/tcp46_snmp.c#8 (text+ko) ==== @@ -197,21 +197,23 @@ assert(tp != NULL); /*next is the encoding for the SNMP table index*/ - all_oid->index.len = 12; + all_oid->index.len = 14; all_oid->index.subs[0] = (uint32_t)IAT_ipv4; + all_oid->index.subs[1] = 4; inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr); - all_oid->index.subs[1] = (inaddr >> 24) & 0xff; - all_oid->index.subs[2] = (inaddr >> 16) & 0xff; - all_oid->index.subs[3] = (inaddr >> 8) & 0xff; - all_oid->index.subs[4] = (inaddr >> 0) & 0xff; - all_oid->index.subs[5] = ntohs(tp->xt_inp.inp_lport); - all_oid->index.subs[6] = (uint32_t)IAT_ipv4; + all_oid->index.subs[2] = (inaddr >> 24) & 0xff; + all_oid->index.subs[3] = (inaddr >> 16) & 0xff; + all_oid->index.subs[4] = (inaddr >> 8) & 0xff; + all_oid->index.subs[5] = (inaddr >> 0) & 0xff; + all_oid->index.subs[6] = ntohs(tp->xt_inp.inp_lport); + all_oid->index.subs[7] = (uint32_t)IAT_ipv4; + all_oid->index.subs[8] = 4; inaddr = ntohl(tp->xt_inp.inp_faddr.s_addr); - all_oid->index.subs[7] = (inaddr >> 24) & 0xff; - all_oid->index.subs[8] = (inaddr >> 16) & 0xff; - all_oid->index.subs[9] = (inaddr >> 8) & 0xff; - all_oid->index.subs[10] = (inaddr >> 0) & 0xff; - all_oid->index.subs[11] = ntohs(tp->xt_inp.inp_fport); + all_oid->index.subs[9] = (inaddr >> 24) & 0xff; + all_oid->index.subs[10] = (inaddr >> 16) & 0xff; + all_oid->index.subs[11] = (inaddr >> 8) & 0xff; + all_oid->index.subs[12] = (inaddr >> 0) & 0xff; + all_oid->index.subs[13] = ntohs(tp->xt_inp.inp_fport); all_oid->so_pgid = get_socket_pid(tp); @@ -228,15 +230,17 @@ assert(all_oid != NULL); assert(tp != NULL); /*next is the encoding for the SNMP table index*/ - all_oid->index.len = 36; + all_oid->index.len = 38; all_oid->index.subs[0] = (uint32_t)IAT_ipv6; + all_oid->index.subs[1] = 16; for (i=0; i<16; i++) { - all_oid->index.subs[1+i] = tp->xt_inp.in6p_laddr.s6_addr[i]; - all_oid->index.subs[19+i] = tp->xt_inp.in6p_faddr.s6_addr[i]; + all_oid->index.subs[2+i] = tp->xt_inp.in6p_laddr.s6_addr[i]; + all_oid->index.subs[21+i] = tp->xt_inp.in6p_faddr.s6_addr[i]; } - all_oid->index.subs[17] = ntohs(tp->xt_inp.in6p_lport); - all_oid->index.subs[18] = (uint32_t)IAT_ipv6; - all_oid->index.subs[35] = ntohs(tp->xt_inp.in6p_fport); + all_oid->index.subs[18] = ntohs(tp->xt_inp.in6p_lport); + all_oid->index.subs[19] = (uint32_t)IAT_ipv6; + all_oid->index.subs[20] = 16; + all_oid->index.subs[37] = ntohs(tp->xt_inp.in6p_fport); all_oid->so_pgid = get_socket_pid(tp); @@ -275,14 +279,14 @@ i++, _oid++ ) { if ( _oid->index.subs[0] == (uint32_t)IAT_ipv6 ) { - if ( _oid->index.subs[17] == ntohs(tp->xt_inp.inp_lport) && + if ( _oid->index.subs[18] == ntohs(tp->xt_inp.inp_lport) && listener_oid->so_pgid == _oid->so_pgid) { L4_DPRINTF((stderr, "V4: [%s] Got listener with port %d.\n ", __func__, - _oid->index.subs[5])); + _oid->index.subs[18])); if (memcmp(&zero_ip6[0], - &_oid->index.subs[1], + &_oid->index.subs[2], sizeof(zero_ip6)) == 0) { /*got it*/ _oid->index.len = 3; @@ -326,25 +330,25 @@ _oid != listener_oid && i < tcp_udp46_state_g.listen_tcpoids_len; i++, _oid++ ) { - if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 ) { - if ( _oid->index.subs[5] == ntohs(tp->xt_inp.in6p_lport) && - listener_oid->so_pgid == _oid->so_pgid ) { - L4_DPRINTF((stderr, "[%s] Got listener with port %d.\n ", - __func__, - _oid->index.subs[5])); - - if (memcmp(&zero_ip4[0], - &_oid->index.subs[1], - sizeof(zero_ip4)) == 0) { - /*got it*/ - _oid->index.len = 3; - _oid->index.subs[0] = (uint32_t)IAT_unknown; - _oid->index.subs[1] = 0; /*zero/ empty octet sting*/ - _oid->index.subs[2] = ntohs(tp->xt_inp.in6p_lport); - return 1; - } - } - } + if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 ) { + if ( _oid->index.subs[6] == ntohs(tp->xt_inp.in6p_lport) && + listener_oid->so_pgid == _oid->so_pgid ) { + L4_DPRINTF((stderr, "[%s] Got listener with port %d.\n ", + __func__, + _oid->index.subs[6])); + + if (memcmp(&zero_ip4[0], + &_oid->index.subs[2], + sizeof(zero_ip4)) == 0) { + /*got it*/ + _oid->index.len = 3; + _oid->index.subs[0] = (uint32_t)IAT_unknown; + _oid->index.subs[1] = 0; /*zero/ empty octet sting*/ + _oid->index.subs[2] = ntohs(tp->xt_inp.in6p_lport); + return 1; + } + } + } } return 0; } @@ -373,14 +377,16 @@ return 1; } /*next is the encoding for the SNMP table index*/ - listener_oid->index.len = 6; + listener_oid->index.len = 7; listener_oid->index.subs[0] = (uint32_t)IAT_ipv4; + listener_oid->index.subs[1] = 4; + inaddr = ntohl(tp->xt_inp.inp_laddr.s_addr); - listener_oid->index.subs[1] = (inaddr >> 24) & 0xff; - listener_oid->index.subs[2] = (inaddr >> 16) & 0xff; - listener_oid->index.subs[3] = (inaddr >> 8) & 0xff; - listener_oid->index.subs[4] = (inaddr >> 0) & 0xff; - listener_oid->index.subs[5] = ntohs(tp->xt_inp.inp_lport); + listener_oid->index.subs[2] = (inaddr >> 24) & 0xff; + listener_oid->index.subs[3] = (inaddr >> 16) & 0xff; + listener_oid->index.subs[4] = (inaddr >> 8) & 0xff; + listener_oid->index.subs[5] = (inaddr >> 0) & 0xff; + listener_oid->index.subs[6] = ntohs(tp->xt_inp.inp_lport); return 0; @@ -412,12 +418,14 @@ } /*next is the encoding for the SNMP table index*/ - listener_oid->index.len = 18; + listener_oid->index.len = 19; listener_oid->index.subs[0] = (uint32_t)IAT_ipv6; + listener_oid->index.subs[1] = 16; + for (i=0; i<16; i++) { - listener_oid->index.subs[1+i] = tp->xt_inp.in6p_laddr.s6_addr[i]; + listener_oid->index.subs[2+i] = tp->xt_inp.in6p_laddr.s6_addr[i]; } - listener_oid->index.subs[17] = ntohs(tp->xt_inp.in6p_lport); + listener_oid->index.subs[18] = ntohs(tp->xt_inp.in6p_lport); @@ -720,15 +728,15 @@ if (conn->subs[0] == (uint32_t)IAT_ipv4) { struct sockaddr_in *sinl, *sinr; - assert(conn->len == 12); - if (conn->len != 12) { + assert(conn->len == 14); + if (conn->len != 14) { syslog(LOG_ERR, "%s: malformed SNMP index (wrong length) when deleting a connection", __func__); return -1; } - if (conn->subs[6] != (uint32_t)IAT_ipv4 ) { + if (conn->subs[7] != (uint32_t)IAT_ipv4 ) { syslog(LOG_ERR, "%s: malformed SNMP index (remote not a v4) when deleting a connection", __func__); @@ -741,12 +749,12 @@ sinl = (struct sockaddr_in *)&addrs[1]; sinl->sin_len = sizeof(struct sockaddr_in); sinl->sin_addr.s_addr = htonl( - (conn->subs[1] << 24) | - (conn->subs[2] << 16) | - (conn->subs[3] << 8) | - (conn->subs[4] << 0) + (conn->subs[2] << 24) | + (conn->subs[3] << 16) | + (conn->subs[4] << 8) | + (conn->subs[5] << 0) ); - sinl->sin_port = htons(conn->subs[5]); + sinl->sin_port = htons(conn->subs[6]); addrs[1].ss_family = AF_INET; (void)inet_ntop(AF_INET, &sinl->sin_addr, local, 64); @@ -758,36 +766,36 @@ sinr->sin_len = sizeof(struct sockaddr_in); sinr->sin_addr.s_addr = htonl( - (conn->subs[7] << 24) | - (conn->subs[8] << 16) | - (conn->subs[9] << 8) | - (conn->subs[10] << 0) + (conn->subs[9] << 24) | + (conn->subs[10] << 16) | + (conn->subs[11] << 8) | + (conn->subs[12] << 0) ); - sinr->sin_port = htons(conn->subs[11]); + sinr->sin_port = htons(conn->subs[13]); addrs[0].ss_family = AF_INET; (void)inet_ntop(AF_INET, &sinr->sin_addr, remote, 64); syslog(LOG_INFO, - "[%s] attempt to delete a tcp4 connection : local: %s:%d - remote: %s:%d \n ", - __func__, - local, - conn->subs[5], - remote, - conn->subs[11]); + "[%s] attempt to delete a tcp4 connection : local: %s:%d - remote: %s:%d \n ", + __func__, + local, + conn->subs[6], + remote, + conn->subs[13]); } else if (conn->subs[0] == (uint32_t)IAT_ipv6) { struct sockaddr_in6 *sin6l, *sin6r; int i = 0; - assert(conn->len == 36); - if (conn->len != 36) { + assert(conn->len == 38); + if (conn->len != 38) { syslog(LOG_ERR, "%s: malformed SNMP index (wrong length) when deleting a connection", __func__); return -1; } - if (conn->subs[18] != (uint32_t)IAT_ipv6 ) { + if (conn->subs[19] != (uint32_t)IAT_ipv6 ) { syslog(LOG_ERR, "%s: malformed SNMP index (remote not a v6) when deleting a connection", __func__); @@ -799,10 +807,10 @@ sin6l = (struct sockaddr_in6 *)&addrs[1]; for (i=0; i<16; i++) { - sin6l->sin6_addr.s6_addr[i] = conn->subs[1+i]; + sin6l->sin6_addr.s6_addr[i] = conn->subs[2+i]; } - sin6l->sin6_port = htons(conn->subs[17]); + sin6l->sin6_port = htons(conn->subs[18]); #ifdef SIN6_LEN sin6l->sin6_len = sizeof(struct sockaddr_in6); #endif /* SIN6_LEN */ @@ -813,10 +821,10 @@ sin6r = (struct sockaddr_in6 *)&addrs[0]; for (i=0; i<16; i++) { - sin6r->sin6_addr.s6_addr[i] = conn->subs[19+i]; + sin6r->sin6_addr.s6_addr[i] = conn->subs[21+i]; } - sin6r->sin6_port = htons(conn->subs[35]); + sin6r->sin6_port = htons(conn->subs[37]); #ifdef SIN6_LEN sin6r->sin6_len = sizeof(struct sockaddr_in6); #endif /* SIN6_LEN */ @@ -828,9 +836,9 @@ "[%s] attempt to delete a tcp6 connection: local: %s:%d - remote: %s:%d \n ", __func__, local, - conn->subs[17], + conn->subs[18], remote, - conn->subs[35]); + conn->subs[37]); } else { ==== //depot/projects/soc2005/bsnmp/usr.sbin/bsnmpd/modules/snmp_tcp_udp46/udp46_snmp.c#8 (text+ko) ==== @@ -150,28 +150,34 @@ in_addr_t inaddr; u_int instance = 1; static - uint32_t zero_ip6[] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint32_t + zero_ip6[] ={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; assert(inp != NULL); pid_owner = get_endpoint_pid(inp); for (i = 0, _oid = tcp_udp46_state_g.all_udpoids; - i < tcp_udp46_state_g.all_udp_total; - i++, _oid++) { - if ( _oid->inp == NULL) { - continue; - } - if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 - && inp->xi_inp.inp_laddr.s_addr == _oid->inp->xi_inp.inp_laddr.s_addr - && inp->xi_inp.inp_lport == _oid->inp->xi_inp.inp_lport - && inp->xi_inp.inp_faddr.s_addr == _oid->inp->xi_inp.inp_faddr.s_addr - && inp->xi_inp.inp_fport == _oid->inp->xi_inp.inp_fport) { + i < tcp_udp46_state_g.all_udp_total; + i++, _oid++) { + if ( _oid->inp == NULL) { + continue; + } + if ( _oid->index.subs[0] == (uint32_t)IAT_ipv4 + && + inp->xi_inp.inp_laddr.s_addr == _oid->inp->xi_inp.inp_laddr.s_addr + && + inp->xi_inp.inp_lport == _oid->inp->xi_inp.inp_lport + && + inp->xi_inp.inp_faddr.s_addr == _oid->inp->xi_inp.inp_faddr.s_addr + && + inp->xi_inp.inp_fport == _oid->inp->xi_inp.inp_fport) { if ( pid_owner != _oid->so_pgid ) { instance++; } else { - return (1); /*duplicate endpoint found*/ + /*duplicate endpoint found*/ + return (1); } } /*check for an existent IPv6 endpoint bound to 0::0/128 */ @@ -181,15 +187,15 @@ _oid->inp->xi_inp.in6p_lport == inp->xi_inp.inp_lport && pid_owner == _oid->so_pgid) { if (memcmp(&zero_ip6[0], - &_oid->index.subs[1], + &_oid->inp->xi_inp.in6p_laddr, sizeof(zero_ip6)) == 0 && memcmp(&zero_ip6[0], - &_oid->index.subs[19], + &_oid->inp->xi_inp.in6p_faddr, sizeof(zero_ip6) ) == 0 ) { /*got it*/ instance = (IN6_IS_ADDR_UNSPECIFIED(&_oid->inp->xi_inp.in6p_faddr) ? - _oid->index.subs[21] : _oid->index.subs[36] ); + _oid->index.subs[22] : _oid->index.subs[38] ); _oid->index.len = 7; _oid->index.subs[0] = (uint32_t)IAT_unknown; @@ -204,36 +210,40 @@ } } - }/*end check for the same application bound to zero v4 & v6 address*/ + } + /*end check for the same application bound to zero + v4 & v6 address*/ } all_oid->index.subs[0] = (uint32_t)IAT_ipv4; + all_oid->index.subs[1] = 4; inaddr = ntohl(inp->xi_inp.inp_laddr.s_addr); - all_oid->index.subs[1] = (inaddr >> 24) & 0xff; - all_oid->index.subs[2] = (inaddr >> 16) & 0xff; - all_oid->index.subs[3] = (inaddr >> 8) & 0xff; - all_oid->index.subs[4] = (inaddr >> 0) & 0xff; - all_oid->index.subs[5] = ntohs(inp->xi_inp.inp_lport); + all_oid->index.subs[2] = (inaddr >> 24) & 0xff; + all_oid->index.subs[3] = (inaddr >> 16) & 0xff; + all_oid->index.subs[4] = (inaddr >> 8) & 0xff; + all_oid->index.subs[5] = (inaddr >> 0) & 0xff; + all_oid->index.subs[6] = ntohs(inp->xi_inp.inp_lport); if(inp->xi_inp.inp_faddr.s_addr == INADDR_ANY && inp->xi_inp.inp_fport == 0 ){ - all_oid->index.len = 10; - all_oid->index.subs[6] = (uint32_t)IAT_unknown; - all_oid->index.subs[7] = 0; /*zero/ empty octet sting*/ - all_oid->index.subs[8] = 0; - all_oid->index.subs[9] = instance; + all_oid->index.len = 11; + all_oid->index.subs[7] = (uint32_t)IAT_unknown; + all_oid->index.subs[8] = 0; /*zero/ empty octet sting*/ + all_oid->index.subs[9] = 0; /*remote port*/ + all_oid->index.subs[10] = instance; } else { - all_oid->index.len = 13; - all_oid->index.subs[6] = (uint32_t)IAT_ipv4; + all_oid->index.len = 15; + all_oid->index.subs[7] = (uint32_t)IAT_ipv4; + all_oid->index.subs[8] = 4; inaddr = ntohl(inp->xi_inp.inp_faddr.s_addr); - all_oid->index.subs[7] = (inaddr >> 24) & 0xff; - all_oid->index.subs[8] = (inaddr >> 16) & 0xff; - all_oid->index.subs[9] = (inaddr >> 8) & 0xff; - all_oid->index.subs[10] = (inaddr >> 0) & 0xff; - all_oid->index.subs[11] = ntohs(inp->xi_inp.inp_fport); - all_oid->index.subs[12] = instance; + all_oid->index.subs[9] = (inaddr >> 24) & 0xff; + all_oid->index.subs[10] = (inaddr >> 16) & 0xff; + all_oid->index.subs[11] = (inaddr >> 8) & 0xff; + all_oid->index.subs[12] = (inaddr >> 0) & 0xff; + all_oid->index.subs[13] = ntohs(inp->xi_inp.inp_fport); + all_oid->index.subs[14] = instance; } all_oid->so_pgid = pid_owner; @@ -286,7 +296,7 @@ /*got it*/ instance = (_oid->inp->xi_inp.inp_faddr.s_addr == INADDR_ANY ? - _oid->index.subs[9] : _oid->index.subs[12] ); + _oid->index.subs[10] : _oid->index.subs[14] ); _oid->index.len = 7; _oid->index.subs[0] = (uint32_t)IAT_unknown; @@ -308,30 +318,33 @@ if ( IN6_IS_ADDR_UNSPECIFIED(&inp->xi_inp.in6p_faddr) && inp->xi_inp.in6p_fport == 0 ) { - all_oid->index.len = 22; + all_oid->index.len = 23; all_oid->index.subs[0] = (uint32_t)IAT_ipv6; + all_oid->index.subs[1] = 16; for (i=0; i<16; i++) { - all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i]; + all_oid->index.subs[2+i] = inp->xi_inp.in6p_laddr.s6_addr[i]; } - all_oid->index.subs[17] = ntohs(inp->xi_inp.in6p_lport); - all_oid->index.subs[18] = (uint32_t)IAT_unknown; - all_oid->index.subs[19] = 0; - all_oid->index.subs[20] = 0; - all_oid->index.subs[21] = instance; + all_oid->index.subs[18] = ntohs(inp->xi_inp.in6p_lport); + all_oid->index.subs[19] = (uint32_t)IAT_unknown; + all_oid->index.subs[20] = 0; /*remote addess, zero octet string*/ + all_oid->index.subs[21] = 0; /*remote port*/ + all_oid->index.subs[22] = instance; } else { - all_oid->index.len = 37; + all_oid->index.len = 39; all_oid->index.subs[0] = (uint32_t)IAT_ipv6; + all_oid->index.subs[0] = 16; for (i=0; i<16; i++) { - all_oid->index.subs[1+i] = inp->xi_inp.in6p_laddr.s6_addr[i]; - all_oid->index.subs[19+i] = inp->xi_inp.in6p_faddr.s6_addr[i]; + all_oid->index.subs[2+i] = inp->xi_inp.in6p_laddr.s6_addr[i]; + all_oid->index.subs[21+i] = inp->xi_inp.in6p_faddr.s6_addr[i]; } - all_oid->index.subs[17] = ntohs(inp->xi_inp.in6p_lport); - all_oid->index.subs[18] = (uint32_t)IAT_ipv6; - all_oid->index.subs[35] = ntohs(inp->xi_inp.in6p_fport); - all_oid->index.subs[36] = instance; + all_oid->index.subs[18] = ntohs(inp->xi_inp.in6p_lport); + all_oid->index.subs[19] = (uint32_t)IAT_ipv6; + all_oid->index.subs[20] = 16; + all_oid->index.subs[37] = ntohs(inp->xi_inp.in6p_fport); + all_oid->index.subs[38] = instance; } all_oid->so_pgid = pid_owner;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509081838.j88IcWgs059875>