mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
cdfc6788a9
This is a cumulative backport of multiple dnsmasq update commits in master. Drops three LEDE specific patches which are included upstream and another patch which became obsolete. Remaining LEDE specific patches are rebased. Fixes FS#766 - Intermittent SIGSEGV crash of dnsmasq-full. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
66 lines
1.9 KiB
Diff
66 lines
1.9 KiB
Diff
--- a/src/ipset.c
|
|
+++ b/src/ipset.c
|
|
@@ -22,7 +22,6 @@
|
|
#include <errno.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
-#include <sys/utsname.h>
|
|
#include <arpa/inet.h>
|
|
#include <linux/version.h>
|
|
#include <linux/netlink.h>
|
|
@@ -72,7 +71,7 @@ struct my_nfgenmsg {
|
|
|
|
#define NL_ALIGN(len) (((len)+3) & ~(3))
|
|
static const struct sockaddr_nl snl = { .nl_family = AF_NETLINK };
|
|
-static int ipset_sock, old_kernel;
|
|
+static int ipset_sock;
|
|
static char *buffer;
|
|
|
|
static inline void add_attr(struct nlmsghdr *nlh, uint16_t type, size_t len, const void *data)
|
|
@@ -87,25 +86,7 @@ static inline void add_attr(struct nlmsg
|
|
|
|
void ipset_init(void)
|
|
{
|
|
- struct utsname utsname;
|
|
- int version;
|
|
- char *split;
|
|
-
|
|
- if (uname(&utsname) < 0)
|
|
- die(_("failed to find kernel version: %s"), NULL, EC_MISC);
|
|
-
|
|
- split = strtok(utsname.release, ".");
|
|
- version = (split ? atoi(split) : 0);
|
|
- split = strtok(NULL, ".");
|
|
- version = version * 256 + (split ? atoi(split) : 0);
|
|
- split = strtok(NULL, ".");
|
|
- version = version * 256 + (split ? atoi(split) : 0);
|
|
- old_kernel = (version < KERNEL_VERSION(2,6,32));
|
|
-
|
|
- if (old_kernel && (ipset_sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) != -1)
|
|
- return;
|
|
-
|
|
- if (!old_kernel &&
|
|
+ if (
|
|
(buffer = safe_malloc(BUFF_SZ)) &&
|
|
(ipset_sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER)) != -1 &&
|
|
(bind(ipset_sock, (struct sockaddr *)&snl, sizeof(snl)) != -1))
|
|
@@ -217,17 +198,10 @@ int add_to_ipset(const char *setname, co
|
|
if (flags & F_IPV6)
|
|
{
|
|
af = AF_INET6;
|
|
- /* old method only supports IPv4 */
|
|
- if (old_kernel)
|
|
- {
|
|
- errno = EAFNOSUPPORT ;
|
|
- ret = -1;
|
|
- }
|
|
}
|
|
#endif
|
|
|
|
- if (ret != -1)
|
|
- ret = old_kernel ? old_add_to_ipset(setname, ipaddr, remove) : new_add_to_ipset(setname, ipaddr, af, remove);
|
|
+ ret = new_add_to_ipset(setname, ipaddr, af, remove);
|
|
|
|
if (ret == -1)
|
|
my_syslog(LOG_ERR, _("failed to update ipset %s: %s"), setname, strerror(errno));
|