buildroot/package/python-iptables/0001-Add-separate-mechanism-to-load-libc.patch
Frank Vanbever 90c18ab269 package/python-iptables: try known libc instead of find_library()
ctypes.util.find_library() depends on gcc and friends to detect the location of
a given shared library. Given that these are not available on the target and
that python-iptables depends on this functionality we need to work around this.
The SONAMEs of the libc are well known so we try the known ones for glibc,
uClibc and musl.

Fixes: https://bugs.busybox.net/show_bug.cgi?id=12271

Signed-off-by: Frank Vanbever <frank.vanbever@essensium.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
2020-04-15 22:24:41 +02:00

91 lines
2.6 KiB
Diff

From e3557528d7cdcdc2c579212be8837bc9b54635a4 Mon Sep 17 00:00:00 2001
From: Frank Vanbever <frank.vanbever@essensium.com>
Date: Thu, 20 Feb 2020 12:14:08 +0100
Subject: [PATCH] Add separate mechanism to load libc
ctypes.util.find_library() always returns None for systems which do not have the
tools installed to determine the location of a given shared library (i.e.
ldconfig, gcc, objdump). If find_libary() fails attempt to load known libc by
SONAME.
Upstream: https://github.com/ldx/python-iptables/commit/e3557528d7cdcdc2c579212be8837bc9b54635a4
Signed-off-by: Frank Vanbever <frank.vanbever@essensium.com>
---
iptc/ip4tc.py | 4 ++--
iptc/util.py | 16 ++++++++++++++++
iptc/xtables.py | 4 ++--
3 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/iptc/ip4tc.py b/iptc/ip4tc.py
index 4c5d690..4ddd2dc 100644
--- a/iptc/ip4tc.py
+++ b/iptc/ip4tc.py
@@ -9,7 +9,7 @@ import socket
import struct
import weakref
-from .util import find_library, load_kernel
+from .util import find_library, load_kernel, find_libc
from .xtables import (XT_INV_PROTO, NFPROTO_IPV4, XTablesError, xtables,
xt_align, xt_counters, xt_entry_target, xt_entry_match)
@@ -26,7 +26,7 @@ if not hasattr(socket, 'IPPROTO_SCTP'):
_IFNAMSIZ = 16
-_libc = ct.CDLL("libc.so.6")
+_libc = find_libc()
_get_errno_loc = _libc.__errno_location
_get_errno_loc.restype = ct.POINTER(ct.c_int)
_malloc = _libc.malloc
diff --git a/iptc/util.py b/iptc/util.py
index ae5fb9b..e6b1649 100644
--- a/iptc/util.py
+++ b/iptc/util.py
@@ -109,3 +109,19 @@ def find_library(*names):
major = int(m.group(1))
return lib, major
return None, None
+
+
+def find_libc():
+ lib = ctypes.util.find_library('c')
+ if lib is not None:
+ return ctypes.CDLL(lib, mode=ctypes.RTLD_GLOBAL)
+
+ libnames = ['libc.so.6', 'libc.so.0', 'libc.so']
+ for name in libnames:
+ try:
+ lib = ctypes.CDLL(name, mode=ctypes.RTLD_GLOBAL)
+ return lib
+ except:
+ pass
+
+ return None
diff --git a/iptc/xtables.py b/iptc/xtables.py
index 93bc080..cf21029 100644
--- a/iptc/xtables.py
+++ b/iptc/xtables.py
@@ -6,7 +6,7 @@ import sys
import weakref
from . import version
-from .util import find_library
+from .util import find_library, find_libc
from .errors import *
XT_INV_PROTO = 0x40 # invert the sense of PROTO
@@ -792,7 +792,7 @@ class xtables_target(ct.Union):
("v12", _xtables_target_v12)]
-_libc, _ = find_library("c")
+_libc = find_libc()
_optind = ct.c_long.in_dll(_libc, "optind")
_optarg = ct.c_char_p.in_dll(_libc, "optarg")
--
2.20.1