aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_uuid.c
diff options
context:
space:
mode:
authorRobert Watson <rwatson@FreeBSD.org>2009-04-19 21:36:18 +0000
committerRobert Watson <rwatson@FreeBSD.org>2009-04-19 21:36:18 +0000
commite5a9a8ead8b4c72b575c0798879aa50b2820ce7c (patch)
treec7e73ce6d362f79cb55f1c7597898f409816e8b4 /sys/kern/kern_uuid.c
parent22037b2d2c9ecd418b2c1c9cee9fba1f7bbb7f4d (diff)
downloadsrc-e5a9a8ead8b4c72b575c0798879aa50b2820ce7c.tar.gz
src-e5a9a8ead8b4c72b575c0798879aa50b2820ce7c.zip
Lock the interface address list while iterating a network interface's
address list when searching for a link-layer address to use during uuid generation. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=191279
Diffstat (limited to 'sys/kern/kern_uuid.c')
-rw-r--r--sys/kern/kern_uuid.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/kern_uuid.c b/sys/kern/kern_uuid.c
index 16105e9cee52..eec37efe14f9 100644
--- a/sys/kern/kern_uuid.c
+++ b/sys/kern/kern_uuid.c
@@ -101,16 +101,19 @@ uuid_node(uint16_t *node)
IFNET_RLOCK();
TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
/* Walk the address list */
+ IF_ADDR_LOCK(ifp);
TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
sdl = (struct sockaddr_dl*)ifa->ifa_addr;
if (sdl != NULL && sdl->sdl_family == AF_LINK &&
sdl->sdl_type == IFT_ETHER) {
/* Got a MAC address. */
bcopy(LLADDR(sdl), node, UUID_NODE_LEN);
+ IF_ADDR_UNLOCK(ifp);
IFNET_RUNLOCK();
return;
}
}
+ IF_ADDR_UNLOCK(ifp);
}
IFNET_RUNLOCK();