Date: Mon, 16 Jul 2007 00:41:09 GMT From: Fredrik Lindberg <fli@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 123560 for review Message-ID: <200707160041.l6G0f97i077608@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123560 Change 123560 by fli@fli_nexus on 2007/07/16 00:40:38 Locking and style fixes. Affected files ... .. //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_mdns.c#6 edit Differences ... ==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/stack_mdns.c#6 (text+ko) ==== @@ -132,7 +132,7 @@ mdns_bufpool_setsize(bp, md->md_maxpkgsz); TAILQ_INIT(&md->md_pkglist); - + RW_INIT(md, md_lock, NULL); MDNS_INIT_SET(md, md_magic); return (0); error: @@ -146,8 +146,6 @@ mdns_destroy(struct mdns *md) { - if (md == NULL) - return; MDNS_INIT_ASSERT(md, md_magic); mdns_udp_close(md, PF_INET); @@ -158,6 +156,7 @@ #endif MDNS_INIT_UNSET(md, md_magic); + RW_DESTROY(md, md_lock); } /* @@ -246,6 +245,8 @@ sock = socket(family, SOCK_DGRAM, 0); if (sock < 0) return (-1); + + RW_WLOCK(md, md_lock); error = fcntl(sock, F_SETFL, O_NONBLOCK); if (error != 0) goto out; @@ -265,7 +266,8 @@ setsockopt(sock, IPPROTO_IP, IP_TTL, &so, sizeof(so)); so = 1; - error = setsockopt(sock, IPPROTO_IP, IP_RECVIF, &so, sizeof(so)); + error = + setsockopt(sock, IPPROTO_IP, IP_RECVIF, &so, sizeof(so)); if (error != 0) goto out; /* Ignore our own multicast packets */ @@ -281,8 +283,8 @@ if (error != 0) goto out; sinptr = (struct sockaddr_in *)&ifreq.ifr_addr; - setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &sinptr->sin_addr.s_addr, - sizeof(sinptr->sin_addr.s_addr)); + setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, + &sinptr->sin_addr.s_addr, sizeof(sinptr->sin_addr.s_addr)); if (error != 0) goto out; @@ -349,8 +351,10 @@ goto out; } + RW_UNLOCK(md, md_lock); return (0); out: + RW_UNLOCK(md, md_lock); close(sock); return (-1); } @@ -366,12 +370,13 @@ int sock; MDNS_INIT_ASSERT(md, md_magic); + RW_RLOCK(md, md_lock); switch (family) { case PF_INET: if (!(md->md_flags & MDNS_UDP4)) { errno = ENOTCONN; - return (-1); + goto out; } sock = md->md_udp4; md->md_flags &= ~MDNS_UDP4; @@ -380,7 +385,7 @@ case PF_INET6: if (!(md->md_flags & MDNS_UDP6)) { errno = ENOTCONN; - return (-1); + goto out; } sock = md->md_udp6; md->md_flags &= ~MDNS_UDP6; @@ -388,12 +393,16 @@ break; default: errno = EPROTONOSUPPORT; - return (-1); + goto out; } mcast_leave(sock, md->md_ifindex, family); close(sock); + RW_UNLOCK(md, md_lock); return (0); +out: + RW_UNLOCK(md, md_lock); + return (-1); } @@ -434,6 +443,7 @@ addrs++; } + RW_WLOCK(md, md_lock); sockp = malloc(sizeof(int) * addrs); if (sockp == NULL) goto out; @@ -448,17 +458,17 @@ md->md_tcp4_sz = addrs; i = 0; for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) == 0) - if (ifa->ifa_addr->sa_family == family) { - sinptr = (struct sockaddr_in *)ifa->ifa_addr; - sock = socket(PF_INET, SOCK_STREAM, 0); - - sin.sin_addr.s_addr = sinptr->sin_addr.s_addr; - error = bind(sock, (const struct sockaddr *)&sin, - sizeof(struct sockaddr_in)); - listen(sock, 10); - md->md_tcp4[i++] = sock; - } + if (ifa->ifa_addr->sa_family != family) + continue; + if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) != 0) + continue; + sinptr = (struct sockaddr_in *)ifa->ifa_addr; + sock = socket(PF_INET, SOCK_STREAM, 0); + sin.sin_addr.s_addr = sinptr->sin_addr.s_addr; + error = bind(sock, (const struct sockaddr *)&sin, + sizeof(struct sockaddr_in)); + listen(sock, 10); + md->md_tcp4[i++] = sock; } md->md_flags |= MDNS_TCP4; break; @@ -472,19 +482,18 @@ md->md_tcp6_sz = addrs; i = 0; for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { - if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) == 0) - if (ifa->ifa_addr->sa_family == family) { - sin6ptr = (struct sockaddr_in6 *)ifa->ifa_addr; - sock = socket(PF_INET6, SOCK_STREAM, 0); - - memcpy(&sin6.sin6_addr, &sin6ptr->sin6_addr, - sizeof(struct in6_addr)); - - error = bind(sock, (const struct sockaddr *)&sin6, - sizeof(struct sockaddr_in6)); - listen(sock, 10); - md->md_tcp6[i++] = sock; - } + if (ifa->ifa_addr->sa_family != family) + continue; + if (strncmp(ifa->ifa_name, md->md_ifnam, IFNAMSIZ) != 0) + continue; + sin6ptr = (struct sockaddr_in6 *)ifa->ifa_addr; + sock = socket(PF_INET6, SOCK_STREAM, 0); + memcpy(&sin6.sin6_addr, &sin6ptr->sin6_addr, + sizeof(struct in6_addr)); + error = bind(sock, (const struct sockaddr *)&sin6, + sizeof(struct sockaddr_in6)); + listen(sock, 10); + md->md_tcp6[i++] = sock; } md->md_flags |= MDNS_TCP6; break; @@ -494,9 +503,11 @@ goto out; } + RW_UNLOCK(md, md_lock); freeifaddrs(ifap); return (0); out: + RW_UNLOCK(md, md_lock); freeifaddrs(ifap); return (-1); } @@ -512,12 +523,13 @@ int i; MDNS_INIT_ASSERT(md, md_magic); + RW_WLOCK(md, md_lock); switch (family) { case PF_INET: if (!(md->md_flags & MDNS_TCP4)) { errno = ENOTCONN; - return (-1); + goto out; } for (i = 0; i < md->md_tcp4_sz; i++) close(md->md_tcp4[i]); @@ -529,7 +541,7 @@ case PF_INET6: if (!(md->md_flags & MDNS_TCP6)) { errno = ENOTCONN; - return (-1); + goto out; } for (i = 0; i < md->md_tcp6_sz; i++) close(md->md_tcp6[i]); @@ -540,9 +552,13 @@ #endif default: errno = EPROTONOSUPPORT; - return (-1); + goto out; } + RW_UNLOCK(md, md_lock); return (0); +out: + RW_UNLOCK(md, md_lock); + return (-1); } /* @@ -559,6 +575,7 @@ int *ret = NULL; MDNS_INIT_ASSERT(md, md_magic); + RW_RLOCK(md, md_lock); *len = 0; switch (family) { @@ -587,6 +604,7 @@ default: errno = EPROTONOSUPPORT; } + RW_UNLOCK(md, md_lock); return (ret); } @@ -613,7 +631,8 @@ msg.msg_controllen = 0; TAILQ_FOREACH(pkg, &pc->pc_head, p_list) { - iov = malloc(sizeof(struct iovec) * MDNS_BUFHSZ(&pkg->p_buflist)); + iov = malloc(sizeof(struct iovec) * + MDNS_BUFHSZ(&pkg->p_buflist)); i = 0; TAILQ_FOREACH(buf, &MDNS_BUFHEAD(&pkg->p_buflist), b_next) { iov[i].iov_base = MDNS_BUF(buf); @@ -643,9 +662,10 @@ { struct sockaddr *sa; socklen_t salen; - int sock; + int sock, error; MDNS_INIT_ASSERT(md, md_magic); + RW_WLOCK(md, md_lock); switch (family) { case PF_INET: @@ -662,10 +682,13 @@ #endif default: errno = EPROTONOSUPPORT; - return (-1); + goto out; } - return (write_pkgchain(sock, pc, sa, salen)); + error = write_pkgchain(sock, pc, sa, salen); + RW_UNLOCK(md, md_lock); +out: + return (error); } @@ -680,9 +703,10 @@ mdns_send_unicast(struct mdns *md, struct mdns_pkgchain *pc, struct sockaddr *sa, socklen_t salen) { - int sock; + int sock, error; MDNS_INIT_ASSERT(md, md_magic); + RW_RLOCK(md, md_lock); switch (sa->sa_family) { case AF_INET: @@ -695,10 +719,14 @@ #endif default: errno = EPROTONOSUPPORT; - return (-1); + goto out; } - return (write_pkgchain(sock, pc, sa, salen)); + error = write_pkgchain(sock, pc, sa, salen); + RW_UNLOCK(md, md_lock); + return (error); +out: + return (-1); } /* @@ -735,6 +763,7 @@ MDNS_INIT_ASSERT(md, md_magic); MDNS_INIT_ASSERT(pc, pc_magic); + RW_RLOCK(md, md_lock); switch (family) { case PF_INET: @@ -751,17 +780,17 @@ #endif default: errno = EPROTONOSUPPORT; - return (-1); + goto error2; } pkg = pc->pc_pkg != NULL ? pc->pc_pkg : pkg_alloc(pc); if (pkg == NULL) - return (-1); + goto error2; buf = MDNS_BUFH(&pkg->p_buflist) != NULL ? MDNS_BUFH(&pkg->p_buflist) : mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, MDNS_BP_HUGE); if (buf == NULL) - return (-1); + goto error2; iov[0].iov_base = MDNS_BUF(buf); iov[0].iov_len = MDNS_BUFSZ(buf); @@ -793,9 +822,12 @@ } #endif + RW_UNLOCK(md, md_lock); return (pkg->p_len); error: mdns_buf_free(md->md_bp, &pkg->p_buflist, buf, 0); +error2: + RW_UNLOCK(md, md_lock); return (-1); } @@ -864,7 +896,8 @@ MDNS_INIT_ASSERT(pc, pc_magic); TAILQ_FOREACH(pkg, &pc->pc_head, p_list) { - iov = malloc(sizeof(struct iovec) * MDNS_BUFHSZ(&pkg->p_buflist)); + iov = malloc(sizeof(struct iovec) * + MDNS_BUFHSZ(&pkg->p_buflist)); i = 0; TAILQ_FOREACH(buf, &MDNS_BUFHEAD(&pkg->p_buflist), b_next) { iov[i].iov_base = MDNS_BUF(buf); @@ -894,15 +927,16 @@ MDNS_INIT_ASSERT(md, md_magic); MDNS_INIT_ASSERT(pc, pc_magic); + RW_RLOCK(md, md_lock); pkg = pc->pc_pkg != NULL ? pc->pc_pkg : pkg_alloc(pc); if (pkg == NULL) - return (-1); + goto error; buf = MDNS_BUFH(&pkg->p_buflist) != NULL ? MDNS_BUFH(&pkg->p_buflist) : mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, MDNS_BP_HUGE); if (buf == NULL) - return (-1); + goto error; for (;;) { n = read(sock, MDNS_BUF(buf), MDNS_BUFSZ(buf)); @@ -910,12 +944,13 @@ break; pkg->p_len += n; MDNS_BUFLEN(buf) = n; - if ((size_t)n < MDNS_BUFSZ(buf) || pkg->p_len >= MDNS_PKG_MAX_LEN) + if ((size_t)n < MDNS_BUFSZ(buf) || + pkg->p_len >= MDNS_PKG_MAX_LEN) break; buf = mdns_buf_alloc(md->md_bp, &pkg->p_buflist, 0, 0); if (buf == NULL) - return (-1); + goto error; } /* @@ -926,9 +961,13 @@ */ buf = mdns_buf_merge(md->md_bp, &pkg->p_buflist, 0); if (buf == NULL) - return (-1); - + goto error; + + RW_UNLOCK(md, md_lock); return (pkg->p_len); +error: + RW_UNLOCK(md, md_lock); + return (-1); } /* @@ -954,37 +993,38 @@ switch (family) { case PF_INET: { - struct ip_mreq mreq; - struct ifreq ifreq; + struct ip_mreq mreq; + struct ifreq ifreq; - error = inet_pton(family, MDNS_MCAST_INET, &mreq.imr_multiaddr); - if (error != 1) - goto error; - if (if_indextoname(ifidx, ifreq.ifr_name) == NULL) - goto error; - error = ioctl(sock, SIOCGIFADDR, &ifreq); - if (error < 0) - goto error; - memcpy(&mreq.imr_interface, - &((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr, - sizeof(struct in_addr)); - error = setsockopt(sock, IPPROTO_IP, - (what ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP), - &mreq, sizeof(struct ip_mreq)); + error = inet_pton(family, MDNS_MCAST_INET, + &mreq.imr_multiaddr); + if (error != 1) + goto error; + if (if_indextoname(ifidx, ifreq.ifr_name) == NULL) + goto error; + error = ioctl(sock, SIOCGIFADDR, &ifreq); + if (error < 0) + goto error; + memcpy(&mreq.imr_interface, + &((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr, + sizeof(struct in_addr)); + error = setsockopt(sock, IPPROTO_IP, + (what ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP), + &mreq, sizeof(struct ip_mreq)); } break; #ifdef INET6 case PF_INET6: { - struct ipv6_mreq mreq6; + struct ipv6_mreq mreq6; - error = inet_pton(family, MDNS_MCAST_INET6, - &mreq6.ipv6mr_multiaddr); - if (error != 1) - goto error; - mreq6.ipv6mr_interface = ifidx; - error = setsockopt(sock, IPPROTO_IPV6, - (what ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP), - &mreq6, sizeof(struct ipv6_mreq)); + error = inet_pton(family, MDNS_MCAST_INET6, + &mreq6.ipv6mr_multiaddr); + if (error != 1) + goto error; + mreq6.ipv6mr_interface = ifidx; + error = setsockopt(sock, IPPROTO_IPV6, + (what ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP), + &mreq6, sizeof(struct ipv6_mreq)); } break; #endif
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707160041.l6G0f97i077608>