diff options
| author | Alexander Motin <mav@FreeBSD.org> | 2008-07-26 21:12:00 +0000 |
|---|---|---|
| committer | Alexander Motin <mav@FreeBSD.org> | 2008-07-26 21:12:00 +0000 |
| commit | 0ca3b0967b7f3acb6d90aad2cf83b5327d0c36f8 (patch) | |
| tree | a6f5961393a2355c43dd79f4e2e071d165210fcc /sys | |
| parent | 14fbef0c79c9dd6084ede3662214220d60d7edba (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/netinet/raw_ip.c | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index a648555809be..ebb840874c43 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -246,28 +246,27 @@ rip_input(struct mbuf *m, int off) ripsrc.sin_family = AF_INET; ripsrc.sin_addr = ip->ip_src; last = NULL; - INP_INFO_RLOCK(&ripcbinfo); hash = INP_PCBHASH_RAW(proto, ip->ip_src.s_addr, ip->ip_dst.s_addr, ripcbinfo.ipi_hashmask); + INP_INFO_RLOCK(&ripcbinfo); LIST_FOREACH(inp, &ripcbinfo.ipi_hashbase[hash], inp_hash) { - INP_RLOCK(inp); - if (inp->inp_ip_p != proto) { - docontinue1: - INP_RUNLOCK(inp); + if (inp->inp_ip_p != proto) continue; - } #ifdef INET6 if ((inp->inp_vflag & INP_IPV4) == 0) - goto docontinue1; + continue; #endif if (inp->inp_laddr.s_addr != ip->ip_dst.s_addr) - goto docontinue1; + continue; if (inp->inp_faddr.s_addr != ip->ip_src.s_addr) - goto docontinue1; + continue; + INP_RLOCK(inp); if (jailed(inp->inp_socket->so_cred) && (htonl(prison_getip(inp->inp_socket->so_cred)) != - ip->ip_dst.s_addr)) - goto docontinue1; + ip->ip_dst.s_addr)) { + INP_RUNLOCK(inp); + continue; + } if (last) { struct mbuf *n; @@ -280,26 +279,25 @@ rip_input(struct mbuf *m, int off) last = inp; } LIST_FOREACH(inp, &ripcbinfo.ipi_hashbase[0], inp_hash) { - INP_RLOCK(inp); - if (inp->inp_ip_p && inp->inp_ip_p != proto) { - docontinue: - INP_RUNLOCK(inp); + if (inp->inp_ip_p && inp->inp_ip_p != proto) continue; - } #ifdef INET6 if ((inp->inp_vflag & INP_IPV4) == 0) - goto docontinue; + continue; #endif if (inp->inp_laddr.s_addr && inp->inp_laddr.s_addr != ip->ip_dst.s_addr) - goto docontinue; + continue; if (inp->inp_faddr.s_addr && inp->inp_faddr.s_addr != ip->ip_src.s_addr) - goto docontinue; - if (jailed(inp->inp_socket->so_cred)) - if (htonl(prison_getip(inp->inp_socket->so_cred)) != - ip->ip_dst.s_addr) - goto docontinue; + continue; + INP_RLOCK(inp); + if (jailed(inp->inp_socket->so_cred) && + (htonl(prison_getip(inp->inp_socket->so_cred)) != + ip->ip_dst.s_addr)) { + INP_RUNLOCK(inp); + continue; + } if (last) { struct mbuf *n; @@ -311,6 +309,7 @@ rip_input(struct mbuf *m, int off) } last = inp; } + INP_INFO_RUNLOCK(&ripcbinfo); if (last != NULL) { if (rip_append(last, ip, m, &ripsrc) != 0) ipstat.ips_delivered--; @@ -320,7 +319,6 @@ rip_input(struct mbuf *m, int off) ipstat.ips_noproto++; ipstat.ips_delivered--; } - INP_INFO_RUNLOCK(&ripcbinfo); } /* |
