| 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 |
| |