mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Fix potential double close in __check_fd if OOM
This commit is contained in:
parent
2a0c698e24
commit
636064eb4c
@ -1,3 +1,9 @@
|
||||
2011-10-30 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/check_pf.c (make_request): Don't call
|
||||
close_not_cancel_no_status here.
|
||||
(__check_pf): Reorganize code a bit to not call close twice if OOM.
|
||||
|
||||
2011-10-29 Ulrich Drepper <drepper@gmail.com>
|
||||
|
||||
[BZ #13276]
|
||||
|
@ -211,8 +211,6 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6,
|
||||
}
|
||||
while (! done);
|
||||
|
||||
close_not_cancel_no_status (fd);
|
||||
|
||||
if (*seen_ipv6 && in6ailist != NULL)
|
||||
{
|
||||
*in6ai = malloc (in6ailistlen * sizeof (**in6ai));
|
||||
@ -262,22 +260,27 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6,
|
||||
{
|
||||
int fd = __socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
|
||||
struct sockaddr_nl nladdr;
|
||||
memset (&nladdr, '\0', sizeof (nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
if (__builtin_expect (fd >= 0, 1))
|
||||
{
|
||||
struct sockaddr_nl nladdr;
|
||||
memset (&nladdr, '\0', sizeof (nladdr));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
|
||||
socklen_t addr_len = sizeof (nladdr);
|
||||
socklen_t addr_len = sizeof (nladdr);
|
||||
|
||||
if (fd >= 0
|
||||
&& __bind (fd, (struct sockaddr *) &nladdr, sizeof (nladdr)) == 0
|
||||
&& __getsockname (fd, (struct sockaddr *) &nladdr, &addr_len) == 0
|
||||
&& make_request (fd, nladdr.nl_pid, seen_ipv4, seen_ipv6,
|
||||
in6ai, in6ailen) == 0)
|
||||
/* It worked. */
|
||||
return;
|
||||
bool success
|
||||
= (__bind (fd, (struct sockaddr *) &nladdr, sizeof (nladdr)) == 0
|
||||
&& __getsockname (fd, (struct sockaddr *) &nladdr,
|
||||
&addr_len) == 0
|
||||
&& make_request (fd, nladdr.nl_pid, seen_ipv4, seen_ipv6,
|
||||
in6ai, in6ailen) == 0);
|
||||
|
||||
if (fd >= 0)
|
||||
__close (fd);
|
||||
close_not_cancel_no_status (fd);
|
||||
|
||||
if (success)
|
||||
/* It worked. */
|
||||
return;
|
||||
}
|
||||
|
||||
#if __ASSUME_NETLINK_SUPPORT == 0
|
||||
/* Remember that there is no netlink support. */
|
||||
|
Loading…
Reference in New Issue
Block a user