summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Sekletar <msekleta@redhat.com>2014-05-16 14:13:43 +0000
committerDavid Lamparter <equinox@opensourcerouting.org>2014-05-27 19:50:45 +0200
commit8e998b1eb5fea53f2a2eddd9f7f2b8ab004406f3 (patch)
tree95b756ddc86e043189c49a930a016051128c949b
parent000e157c852653288c5a1e6d0dee821c1765d315 (diff)
downloadquagga-8e998b1eb5fea53f2a2eddd9f7f2b8ab004406f3.tar.bz2
quagga-8e998b1eb5fea53f2a2eddd9f7f2b8ab004406f3.tar.xz
zebra: raise the privileges before calling socket()
Because of recent changes when creating AF_NETLINK socket, kernel will cache capabilities of the caller and if file descriptor is used or otherwise handed to another process it will check that current user has necessary capabilities to use the socket. Hence we need to ensure we have necessary capabilities when creating the socket and at the time we use the socket. See: http://www.spinics.net/lists/netdev/msg280198.html Signed-off-by: Michal Sekletar <msekleta@redhat.com> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--zebra/rt_netlink.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index ba0b0d7d..6a802f69 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -162,6 +162,12 @@ netlink_socket (struct nlsock *nl, unsigned long groups)
int namelen;
int save_errno;
+ if (zserv_privs.change (ZPRIVS_RAISE))
+ {
+ zlog (NULL, LOG_ERR, "Can't raise privileges");
+ return -1;
+ }
+
sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0)
{
@@ -175,12 +181,6 @@ netlink_socket (struct nlsock *nl, unsigned long groups)
snl.nl_groups = groups;
/* Bind the socket to the netlink structure for anything. */
- if (zserv_privs.change (ZPRIVS_RAISE))
- {
- zlog (NULL, LOG_ERR, "Can't raise privileges");
- return -1;
- }
-
ret = bind (sock, (struct sockaddr *) &snl, sizeof snl);
save_errno = errno;
if (zserv_privs.change (ZPRIVS_LOWER))