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 <eparis@redhat.com>
This commit is contained in:
Dan Walsh 2012-07-31 10:12:46 -04:00 committed by Eric Paris
parent a8a36f88c2
commit 1c8a7c194d

View File

@ -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",