mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-26 15:36:14 +01:00
GNetworkMonitorNetlink: make the netlink socket cloexec
Use the same code GSocket does, to try SOCK_CLOEXEC first, and then fall back to FD_CLOEXEC if it fails. (And fix that code to not call fcntl if SOCK_CLOEXEC worked.) https://bugzilla.gnome.org/show_bug.cgi?id=692332
This commit is contained in:
parent
2476dd24d7
commit
5932e16acd
@ -34,6 +34,11 @@ gchar * _g_uri_from_authority (const gchar *protocol,
|
|||||||
guint port,
|
guint port,
|
||||||
const gchar *userinfo);
|
const gchar *userinfo);
|
||||||
|
|
||||||
|
gint g_socket (gint domain,
|
||||||
|
gint type,
|
||||||
|
gint protocol,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __G_NETWORKINGPRIVATE_H__ */
|
#endif /* __G_NETWORKINGPRIVATE_H__ */
|
||||||
|
@ -89,7 +89,7 @@ g_network_monitor_netlink_initable_init (GInitable *initable,
|
|||||||
/* We create the socket the old-school way because sockaddr_netlink
|
/* We create the socket the old-school way because sockaddr_netlink
|
||||||
* can't be represented as a GSocketAddress
|
* can't be represented as a GSocketAddress
|
||||||
*/
|
*/
|
||||||
sockfd = socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
sockfd = g_socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE, NULL);
|
||||||
if (sockfd == -1)
|
if (sockfd == -1)
|
||||||
{
|
{
|
||||||
int errsv = errno;
|
int errsv = errno;
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
#include "gioerror.h"
|
#include "gioerror.h"
|
||||||
#include "gioenums.h"
|
#include "gioenums.h"
|
||||||
#include "gioerror.h"
|
#include "gioerror.h"
|
||||||
#include "gnetworking.h"
|
#include "gnetworkingprivate.h"
|
||||||
#include "gsocketaddress.h"
|
#include "gsocketaddress.h"
|
||||||
#include "gsocketcontrolmessage.h"
|
#include "gsocketcontrolmessage.h"
|
||||||
#include "gcredentials.h"
|
#include "gcredentials.h"
|
||||||
@ -482,6 +482,55 @@ g_socket_details_from_fd (GSocket *socket)
|
|||||||
socket_strerror (errsv));
|
socket_strerror (errsv));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wrapper around socket() that is shared with gnetworkmonitornetlink.c */
|
||||||
|
gint
|
||||||
|
g_socket (gint domain,
|
||||||
|
gint type,
|
||||||
|
gint protocol,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
#ifdef SOCK_CLOEXEC
|
||||||
|
fd = socket (domain, type | SOCK_CLOEXEC, protocol);
|
||||||
|
if (fd != -1)
|
||||||
|
return fd;
|
||||||
|
|
||||||
|
/* It's possible that libc has SOCK_CLOEXEC but the kernel does not */
|
||||||
|
if (fd < 0 && errno == EINVAL)
|
||||||
|
#endif
|
||||||
|
fd = socket (domain, type, protocol);
|
||||||
|
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
int errsv = get_socket_errno ();
|
||||||
|
|
||||||
|
g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
|
||||||
|
_("Unable to create socket: %s"), socket_strerror (errsv));
|
||||||
|
errno = errsv;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef G_OS_WIN32
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/* We always want to set close-on-exec to protect users. If you
|
||||||
|
need to so some weird inheritance to exec you can re-enable this
|
||||||
|
using lower level hacks with g_socket_get_fd(). */
|
||||||
|
flags = fcntl (fd, F_GETFD, 0);
|
||||||
|
if (flags != -1 &&
|
||||||
|
(flags & FD_CLOEXEC) == 0)
|
||||||
|
{
|
||||||
|
flags |= FD_CLOEXEC;
|
||||||
|
fcntl (fd, F_SETFD, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
g_socket_create_socket (GSocketFamily family,
|
g_socket_create_socket (GSocketFamily family,
|
||||||
GSocketType type,
|
GSocketType type,
|
||||||
@ -489,7 +538,6 @@ g_socket_create_socket (GSocketFamily family,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gint native_type;
|
gint native_type;
|
||||||
gint fd;
|
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@ -523,39 +571,7 @@ g_socket_create_socket (GSocketFamily family,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SOCK_CLOEXEC
|
return g_socket (family, native_type, protocol, error);
|
||||||
fd = socket (family, native_type | SOCK_CLOEXEC, protocol);
|
|
||||||
/* It's possible that libc has SOCK_CLOEXEC but the kernel does not */
|
|
||||||
if (fd < 0 && errno == EINVAL)
|
|
||||||
#endif
|
|
||||||
fd = socket (family, native_type, protocol);
|
|
||||||
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
int errsv = get_socket_errno ();
|
|
||||||
|
|
||||||
g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
|
|
||||||
_("Unable to create socket: %s"), socket_strerror (errsv));
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef G_OS_WIN32
|
|
||||||
{
|
|
||||||
int flags;
|
|
||||||
|
|
||||||
/* We always want to set close-on-exec to protect users. If you
|
|
||||||
need to so some weird inheritance to exec you can re-enable this
|
|
||||||
using lower level hacks with g_socket_get_fd(). */
|
|
||||||
flags = fcntl (fd, F_GETFD, 0);
|
|
||||||
if (flags != -1 &&
|
|
||||||
(flags & FD_CLOEXEC) == 0)
|
|
||||||
{
|
|
||||||
flags |= FD_CLOEXEC;
|
|
||||||
fcntl (fd, F_SETFD, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user