43df5c
From aa562a660d1555b13cffbac1e744033e91f82707 Mon Sep 17 00:00:00 2001
43df5c
From: Pablo Neira Ayuso <pablo@netfilter.org>
43df5c
Date: Fri, 16 Jan 2015 14:21:57 +0100
43df5c
Subject: iptables: use flock() instead of abstract unix sockets
43df5c
43df5c
Abstract unix sockets cannot be used to synchronize several concurrent
43df5c
instances of iptables since an unpriviledged process can create them and
43df5c
prevent the legitimate iptables instance from running.
43df5c
43df5c
Use flock() and /run instead as suggested by Lennart Poettering.
43df5c
43df5c
Fixes: 93587a0 ("ip[6]tables: Add locking to prevent concurrent instances")
43df5c
Reported-by: Lennart Poettering <lennart@poettering.net>
43df5c
Cc: Phil Oester <kernel@linuxace.com>
43df5c
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
43df5c
43df5c
diff --git a/iptables/xshared.c b/iptables/xshared.c
43df5c
index b18022e..7beb86b 100644
43df5c
--- a/iptables/xshared.c
43df5c
+++ b/iptables/xshared.c
43df5c
@@ -9,11 +9,11 @@
43df5c
 #include <sys/socket.h>
43df5c
 #include <sys/un.h>
43df5c
 #include <unistd.h>
43df5c
+#include <fcntl.h>
43df5c
 #include <xtables.h>
43df5c
 #include "xshared.h"
43df5c
 
43df5c
-#define XT_SOCKET_NAME "xtables"
43df5c
-#define XT_SOCKET_LEN 8
43df5c
+#define XT_LOCK_NAME	"/run/xtables.lock"
43df5c
 
43df5c
 /*
43df5c
  * Print out any special helps. A user might like to be able to add a --help
43df5c
@@ -245,22 +245,14 @@ void xs_init_match(struct xtables_match *match)
43df5c
 
43df5c
 bool xtables_lock(int wait)
43df5c
 {
43df5c
-	int i = 0, ret, xt_socket;
43df5c
-	struct sockaddr_un xt_addr;
43df5c
-	int waited = 0;
43df5c
-
43df5c
-	memset(&xt_addr, 0, sizeof(xt_addr));
43df5c
-	xt_addr.sun_family = AF_UNIX;
43df5c
-	strcpy(xt_addr.sun_path+1, XT_SOCKET_NAME);
43df5c
-	xt_socket = socket(AF_UNIX, SOCK_STREAM, 0);
43df5c
-	/* If we can't even create a socket, fall back to prior (lockless) behavior */
43df5c
-	if (xt_socket < 0)
43df5c
+	int fd, waited = 0, i = 0;
43df5c
+
43df5c
+	fd = open(XT_LOCK_NAME, O_CREAT, 0600);
43df5c
+	if (fd < 0)
43df5c
 		return true;
43df5c
 
43df5c
 	while (1) {
43df5c
-		ret = bind(xt_socket, (struct sockaddr*)&xt_addr,
43df5c
-			   offsetof(struct sockaddr_un, sun_path)+XT_SOCKET_LEN);
43df5c
-		if (ret == 0)
43df5c
+		if (flock(fd, LOCK_EX | LOCK_NB) == 0)
43df5c
 			return true;
43df5c
 		else if (wait >= 0 && waited >= wait)
43df5c
 			return false;
43df5c
-- 
43df5c
cgit v0.10.2
43df5c
43df5c
commit 6dc53c514f1e4683e51a877b3a2f3128cfccef28
43df5c
Author: Pablo Neira Ayuso <pablo@netfilter.org>
43df5c
Date:   Mon Feb 16 16:57:39 2015 +0100
43df5c
43df5c
    xshared: calm down compilation warning
43df5c
    
43df5c
    xshared.c: In function ‘xtables_lock’:
43df5c
    xshared.c:255:3: warning: implicit declaration of function ‘flock’ [-Wimplicit-function-declaration]
43df5c
    
43df5c
    Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
43df5c
43df5c
diff --git a/iptables/xshared.c b/iptables/xshared.c
43df5c
index 7beb86b..81c2581 100644
43df5c
--- a/iptables/xshared.c
43df5c
+++ b/iptables/xshared.c
43df5c
@@ -6,6 +6,7 @@
43df5c
 #include <stdio.h>
43df5c
 #include <stdlib.h>
43df5c
 #include <string.h>
43df5c
+#include <sys/file.h>
43df5c
 #include <sys/socket.h>
43df5c
 #include <sys/un.h>
43df5c
 #include <unistd.h>