From 1c8a7c194d3a3f72be5d02d50df2f7b679aeabe7 Mon Sep 17 00:00:00 2001 From: Dan Walsh Date: Tue, 31 Jul 2012 10:12:46 -0400 Subject: [PATCH] libselinux: Ensure that we only close the selinux netlink socket once. Taken from our Android libselinux tree. From Stephen Smalley. Signed-off-by: Eric Paris --- libselinux/src/avc_internal.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libselinux/src/avc_internal.c b/libselinux/src/avc_internal.c index a07aa7fb..6d508eeb 100644 --- a/libselinux/src/avc_internal.c +++ b/libselinux/src/avc_internal.c @@ -53,7 +53,7 @@ int avc_setenforce = 0; int avc_netlink_trouble = 0; /* netlink socket code */ -static int fd; +static int fd = -1; int avc_netlink_open(int blocking) { @@ -69,6 +69,7 @@ int avc_netlink_open(int blocking) fcntl(fd, F_SETFD, FD_CLOEXEC); if (!blocking && fcntl(fd, F_SETFL, O_NONBLOCK)) { close(fd); + fd = -1; rc = -1; goto out; } @@ -81,6 +82,7 @@ int avc_netlink_open(int blocking) if (bind(fd, (struct sockaddr *)&addr, len) < 0) { close(fd); + fd = -1; rc = -1; goto out; } @@ -90,7 +92,9 @@ int avc_netlink_open(int blocking) void avc_netlink_close(void) { - close(fd); + if (fd >= 0) + close(fd); + fd = -1; } static int avc_netlink_receive(char *buf, unsigned buflen, int blocking) @@ -269,6 +273,7 @@ void avc_netlink_loop(void) } close(fd); + fd = -1; avc_netlink_trouble = 1; avc_log(SELINUX_ERROR, "%s: netlink thread: errors encountered, terminating\n",