[Tarantool-patches] [PATCH] Ensure all curl symbols are exported

Timur Safin tsafin at tarantool.org
Thu Aug 6 18:06:35 MSK 2020


Much respect for the outstanding symbol loader test!

LGTM

Timur

: From: Tarantool-patches <tarantool-patches-bounces at dev.tarantool.org> On
: Behalf Of Yaroslav Dynnikov
: Subject: [Tarantool-patches] [PATCH] Ensure all curl symbols are exported
: 
: In the recent update of libcurl (2.5.0-278-g807c7fa58) its layout has
: changed: private function `Curl_version_init()` which used to fill-in
: info structure was eliminated. As a result, no symbols for
: `libcurl_la-version.o` remained used, so it wasn't included in tarantool
: binary. And `curl_version` and `curl_version_info` symbols went missing.
: 
: According to libcurl naming conventions all exported symbols are named
: as `curl_*`. This patch lists them all explicitly in `exprots.h` and
: adds the test.
: 
: Close #5223
: 
: Issue: https://github.com/tarantool/tarantool/issues/5223
: Branch: https://github.com/tarantool/tarantool/tree/rosik/gh-5223-missing-
: curl-symbols
: 
: ---
:  src/exports.h                              |  81 ++++++++++
:  test/box-tap/gh-5223-curl-exports.test.lua | 177 +++++++++++++++++++++
:  2 files changed, 258 insertions(+)
:  create mode 100755 test/box-tap/gh-5223-curl-exports.test.lua
: 
: diff --git a/src/exports.h b/src/exports.h
: index 7cf283e5b..7f0601f4f 100644
: --- a/src/exports.h
: +++ b/src/exports.h
: @@ -113,6 +113,87 @@ EXPORT(csv_feed)
:  EXPORT(csv_iterator_create)
:  EXPORT(csv_next)
:  EXPORT(csv_setopt)
: +EXPORT(curl_easy_cleanup)
: +EXPORT(curl_easy_duphandle)
: +EXPORT(curl_easy_escape)
: +EXPORT(curl_easy_getinfo)
: +EXPORT(curl_easy_init)
: +EXPORT(curl_easy_pause)
: +EXPORT(curl_easy_perform)
: +EXPORT(curl_easy_recv)
: +EXPORT(curl_easy_reset)
: +EXPORT(curl_easy_send)
: +EXPORT(curl_easy_setopt)
: +EXPORT(curl_easy_strerror)
: +EXPORT(curl_easy_unescape)
: +EXPORT(curl_easy_upkeep)
: +EXPORT(curl_escape)
: +EXPORT(curl_formadd)
: +EXPORT(curl_formfree)
: +EXPORT(curl_formget)
: +EXPORT(curl_free)
: +EXPORT(curl_getdate)
: +EXPORT(curl_getenv)
: +EXPORT(curl_global_cleanup)
: +EXPORT(curl_global_init)
: +EXPORT(curl_global_init_mem)
: +EXPORT(curl_global_sslset)
: +EXPORT(curl_maprintf)
: +EXPORT(curl_mfprintf)
: +EXPORT(curl_mime_addpart)
: +EXPORT(curl_mime_data)
: +EXPORT(curl_mime_data_cb)
: +EXPORT(curl_mime_encoder)
: +EXPORT(curl_mime_filedata)
: +EXPORT(curl_mime_filename)
: +EXPORT(curl_mime_free)
: +EXPORT(curl_mime_headers)
: +EXPORT(curl_mime_init)
: +EXPORT(curl_mime_name)
: +EXPORT(curl_mime_subparts)
: +EXPORT(curl_mime_type)
: +EXPORT(curl_mprintf)
: +EXPORT(curl_msnprintf)
: +EXPORT(curl_msprintf)
: +EXPORT(curl_multi_add_handle)
: +EXPORT(curl_multi_assign)
: +EXPORT(curl_multi_cleanup)
: +EXPORT(curl_multi_fdset)
: +EXPORT(curl_multi_info_read)
: +EXPORT(curl_multi_init)
: +EXPORT(curl_multi_perform)
: +EXPORT(curl_multi_poll)
: +EXPORT(curl_multi_remove_handle)
: +EXPORT(curl_multi_setopt)
: +EXPORT(curl_multi_socket)
: +EXPORT(curl_multi_socket_action)
: +EXPORT(curl_multi_socket_all)
: +EXPORT(curl_multi_strerror)
: +EXPORT(curl_multi_timeout)
: +EXPORT(curl_multi_wait)
: +EXPORT(curl_mvaprintf)
: +EXPORT(curl_mvfprintf)
: +EXPORT(curl_mvprintf)
: +EXPORT(curl_mvsnprintf)
: +EXPORT(curl_mvsprintf)
: +EXPORT(curl_pushheader_byname)
: +EXPORT(curl_pushheader_bynum)
: +EXPORT(curl_share_cleanup)
: +EXPORT(curl_share_init)
: +EXPORT(curl_share_setopt)
: +EXPORT(curl_share_strerror)
: +EXPORT(curl_slist_append)
: +EXPORT(curl_slist_free_all)
: +EXPORT(curl_strequal)
: +EXPORT(curl_strnequal)
: +EXPORT(curl_unescape)
: +EXPORT(curl_url)
: +EXPORT(curl_url_cleanup)
: +EXPORT(curl_url_dup)
: +EXPORT(curl_url_get)
: +EXPORT(curl_url_set)
: +EXPORT(curl_version)
: +EXPORT(curl_version_info)
:  EXPORT(decimal_unpack)
:  EXPORT(error_ref)
:  EXPORT(error_set_prev)
: diff --git a/test/box-tap/gh-5223-curl-exports.test.lua b/test/box-tap/gh-
: 5223-curl-exports.test.lua
: new file mode 100755
: index 000000000..300d60b07
: --- /dev/null
: +++ b/test/box-tap/gh-5223-curl-exports.test.lua
: @@ -0,0 +1,177 @@
: +#!/usr/bin/env tarantool
: +
: +local tap = require('tap')
: +local ffi = require('ffi')
: +ffi.cdef([[
: +    void *dlsym(void *handle, const char *symbol);
: +    struct curl_version_info_data {
: +        int age;                  /* see description below */
: +        const char *version;      /* human readable string */
: +        unsigned int version_num; /* numeric representation */
: +        const char *host;         /* human readable string */
: +        int features;             /* bitmask, see below */
: +        char *ssl_version;        /* human readable string */
: +        long ssl_version_num;     /* not used, always zero */
: +        const char *libz_version; /* human readable string */
: +        const char * const *protocols; /* protocols */
: +
: +        /* when 'age' is CURLVERSION_SECOND or higher, the members below
: exist */
: +        const char *ares;         /* human readable string */
: +        int ares_num;             /* number */
: +
: +        /* when 'age' is CURLVERSION_THIRD or higher, the members below
: exist */
: +        const char *libidn;       /* human readable string */
: +
: +        /* when 'age' is CURLVERSION_FOURTH or higher (>= 7.16.1), the
: members
: +           below exist */
: +        int iconv_ver_num;       /* '_libiconv_version' if iconv support
: enabled */
: +
: +        const char *libssh_version; /* human readable string */
: +
: +        /* when 'age' is CURLVERSION_FIFTH or higher (>= 7.57.0), the
: members
: +           below exist */
: +        unsigned int brotli_ver_num; /* Numeric Brotli version
: +                                        (MAJOR << 24) | (MINOR << 12) |
: PATCH */
: +        const char *brotli_version; /* human readable string. */
: +
: +        /* when 'age' is CURLVERSION_SIXTH or higher (>= 7.66.0), the
: members
: +           below exist */
: +        unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
: +                                         (MAJOR << 16) | (MINOR << 8) |
: PATCH */
: +        const char *nghttp2_version; /* human readable string. */
: +
: +        const char *quic_version;    /* human readable quic (+ HTTP/3)
: library +
: +                                        version or NULL */
: +
: +        /* when 'age' is CURLVERSION_SEVENTH or higher (>= 7.70.0), the
: members
: +           below exist */
: +        const char *cainfo;          /* the built-in default
: CURLOPT_CAINFO, might
: +                                        be NULL */
: +        const char *capath;          /* the built-in default
: CURLOPT_CAPATH, might
: +                                        be NULL */
: +    };
: +
: +    struct curl_version_info_data *curl_version_info(int age);
: +]])
: +
: +local info = ffi.C.curl_version_info(7)
: +local test = tap.test('curl-features')
: +test:plan(3)
: +
: +if test:ok(info.ssl_version ~= nil, 'Curl built with SSL support') then
: +    test:diag('ssl_version: ' .. ffi.string(info.ssl_version))
: +end
: +if test:ok(info.libz_version ~= nil, 'Curl built with LIBZ') then
: +    test:diag('libz_version: ' .. ffi.string(info.libz_version))
: +end
: +
: +local RTLD_DEFAULT
: +-- See `man 3 dlsym`:
: +-- RTLD_DEFAULT
: +--   Find  the  first occurrence of the desired symbol using the default
: +--   shared object search order.  The search will include global symbols
: +--   in the executable and its dependencies, as well as symbols in shared
: +--   objects that were dynamically loaded with the RTLD_GLOBAL flag.
: +if jit.os == "OSX" then
: +    RTLD_DEFAULT = ffi.cast("void *", -2LL)
: +else
: +    RTLD_DEFAULT = ffi.cast("void *", 0LL)
: +end
: +
: +-- The following list was obtained by parsing libcurl.a static library:
: +-- nm libcurl.a | grep -oP 'T \K(curl_.+)$' | sort
: +local curl_symbols = {
: +    'curl_easy_cleanup',
: +    'curl_easy_duphandle',
: +    'curl_easy_escape',
: +    'curl_easy_getinfo',
: +    'curl_easy_init',
: +    'curl_easy_pause',
: +    'curl_easy_perform',
: +    'curl_easy_recv',
: +    'curl_easy_reset',
: +    'curl_easy_send',
: +    'curl_easy_setopt',
: +    'curl_easy_strerror',
: +    'curl_easy_unescape',
: +    'curl_easy_upkeep',
: +    'curl_escape',
: +    'curl_formadd',
: +    'curl_formfree',
: +    'curl_formget',
: +    'curl_free',
: +    'curl_getdate',
: +    'curl_getenv',
: +    'curl_global_cleanup',
: +    'curl_global_init',
: +    'curl_global_init_mem',
: +    'curl_global_sslset',
: +    'curl_maprintf',
: +    'curl_mfprintf',
: +    'curl_mime_addpart',
: +    'curl_mime_data',
: +    'curl_mime_data_cb',
: +    'curl_mime_encoder',
: +    'curl_mime_filedata',
: +    'curl_mime_filename',
: +    'curl_mime_free',
: +    'curl_mime_headers',
: +    'curl_mime_init',
: +    'curl_mime_name',
: +    'curl_mime_subparts',
: +    'curl_mime_type',
: +    'curl_mprintf',
: +    'curl_msnprintf',
: +    'curl_msprintf',
: +    'curl_multi_add_handle',
: +    'curl_multi_assign',
: +    'curl_multi_cleanup',
: +    'curl_multi_fdset',
: +    'curl_multi_info_read',
: +    'curl_multi_init',
: +    'curl_multi_perform',
: +    'curl_multi_poll',
: +    'curl_multi_remove_handle',
: +    'curl_multi_setopt',
: +    'curl_multi_socket',
: +    'curl_multi_socket_action',
: +    'curl_multi_socket_all',
: +    'curl_multi_strerror',
: +    'curl_multi_timeout',
: +    'curl_multi_wait',
: +    'curl_mvaprintf',
: +    'curl_mvfprintf',
: +    'curl_mvprintf',
: +    'curl_mvsnprintf',
: +    'curl_mvsprintf',
: +    'curl_pushheader_byname',
: +    'curl_pushheader_bynum',
: +    'curl_share_cleanup',
: +    'curl_share_init',
: +    'curl_share_setopt',
: +    'curl_share_strerror',
: +    'curl_slist_append',
: +    'curl_slist_free_all',
: +    'curl_strequal',
: +    'curl_strnequal',
: +    'curl_unescape',
: +    'curl_url',
: +    'curl_url_cleanup',
: +    'curl_url_dup',
: +    'curl_url_get',
: +    'curl_url_set',
: +    'curl_version',
: +    'curl_version_info',
: +}
: +
: +test:test('curl_symbols', function(t)
: +    t:plan(#curl_symbols)
: +    for _, sym in ipairs(curl_symbols) do
: +        t:ok(
: +            ffi.C.dlsym(RTLD_DEFAULT, sym) ~= nil,
: +            ('Symbol %q found'):format(sym)
: +        )
: +    end
: +end)
: +
: +os.exit(test:check() and 0 or 1)
: --
: 2.25.1




More information about the Tarantool-patches mailing list