diff options
author | Azat Khuzhin <azat@libevent.org> | 2020-07-05 15:01:34 +0300 |
---|---|---|
committer | Azat Khuzhin <azat@libevent.org> | 2020-07-05 15:02:46 +0300 |
commit | 5df3037d10556bfcb675bc73e516978b75fc7bc7 (patch) | |
tree | 9b59b8aec360426931f641d0e58fe57d2e442bad /evutil.c | |
parent | 4c908dde58ef780eeefcc9df4db3063ca62ea862 (diff) | |
parent | 1324a03c125faa9404c91dbecec540a681a97367 (diff) | |
download | libevent-patches-2.1.tar.gz |
Merge branch 'release-2.1.12-stable-pull' into patches-2.1release-2.1.12-stablepatches-2.1
PR: https://github.com/libevent/libevent/pull/1045
* release-2.1.12-stable-pull:
Update ChangeLog
ci/linux: create dist artifact only if dist archive was built
Merge branch 'fix-signal-leak'
test: fix leak in dns/getaddrinfo_cancel_stress
test: fix UB in evbuffer/empty_reference_prepend_buffer
ci: set build type to debug with sanitizers
test: really disable bufferevent_pair_release_lock under ASAN (and fix gcc)
test-closed: fix leak
test-export: adjust libevent version
cmake: set rpath for libraries on linux
test-export: compatible with all versions of visual studio
Bump version to 2.1.12-stable (w/o ABI breakage)
ci: run ABI for release-*-pull branches too
Purge travis-ci config
Purge appveyor config
Bump ChangeLog for 2.1.12
Update AUTHORS for 2.1.12
Backport github actions to 2.1
test: add getaddrinfo(AI_ADDRCONFIG) test (off by default)
build: remove duplicate -Wredundant-decls
test: fix memory leaks for https (add BEV_OPT_CLOSE_ON_FREE)
test: "fix" (with a quirk) leak in ssl/bufferevent_wm (w/o defer callbacks)
test: disable bufferevent/bufferevent_pair_release_lock under ASAN (too tricky)
test: detect test failures if atexit handler calls _exit(!0) (sanitizers)
Make all classes Entry, Struct, etc) new-style classes
buffer: do not pass NULL to memcpy() from evbuffer_pullup()
test: do not pass NULL to memcmp() in evbuffer_datacmp() helper
http: fix undefined-shift in EVUTIL_IS*_ helpers
Check error code of evhttp_add_header_internal() in evhttp_parse_query_impl()
cmake: avoid problems from use of CMAKE_USE_PTHREADS_INIT
test/regress_testutils: use inet_addr()
remove FindGit.cmake, improve `git describe` command
checkpatch.sh: fix clang-format-diff usage
checkpatch.sh: fix usage
Fix clang-format-diff usage
variable redefinition in win32_dispatch
test: http/autofree_connection cleanup
http: fix EVHTTP_CON_AUTOFREE in case of timeout (and some else)
test: cleanup http/autofree_connection
test: fix http/autofree_connection
evdns: Add additional validation for values of dns options
test: Fix test_simpleclose for Windows platform
abi-check: abi-monitor 1.10 does not support -make -j8 (1.12 supports though)
Add API/ABI checker (using LVC)
Update list of cmake files for autotools dist archive
Pass --quiet to the event_rcpgen.py (autotools already does this)
There is typo in GetAdaptersAddresses windows library. It should be iphlpapi.dll
Support EV_CLOSED on linux for poll(2)
Fix EV_CLOSED detection/reporting (epoll only)
Merge branch 'EV_CLOSED-and-EV_ET-fixes'
bufferevent: allow setting priority on socket and openssl type
cmake: set a default value for LIBEVENT_STATIC_LINK
evutil_time: improve evutil_gettimeofday on Windows
bench: Allow backend method selection
cmake: missing test-closed binary
Merge branch 'event_rpcgen.py-cleanup'
cmake: replace CheckFunctionExists with CheckSymbolExists
LibeventConfig.cmake: restore CMAKE_FIND_LIBRARY_SUFFIXES and LIBEVENT_STATIC_LINK default
cmake: fix getaddrinfo checking error
cmake: remove CheckFunctionExistsEx
autoconf: fix getaddrinfo checking errors on mingw
test-time: do not use deprecated API
test-time: enable debug mode if EVENT_DEBUG_LOGGING_ALL env set
increase segment refcnt only if evbuffer_add_file_segment() succeeds
evdns: fix a crash when evdns_base with waiting requests is freed
event_base_once: fix potential null pointer threat
test-ratelim: add missing free
Do not use shared global structures on CYGWIN
test: move thread into realtime class even on EVENT__DISABLE_THREAD_SUPPORT
test: fix compilation without thread support (EVENT__DISABLE_THREAD_SUPPORT=ON)
test: fix bufferevent/bufferevent_connect_fail_eventcb* under osx/freebsd
test: fix dst thread in move_pthread_to_realtime_scheduling_class (osx)
test: fix compilation under win32 (rearrange thread_setup() code)
test: use THREAD_* wrappers over pthread* in del_notify
Merge branch 'osx-clock'
cmake: do not print used method (EVENT_SHOW_METHOD) while running tests
cmake: run regress test quietly like autotools (makes CI logs cleaner)
Merge branch 'http-connect'
http: do not assume body for CONNECT
Added uninstall target check to cmakelists
Fix compilation without OPENSSL_API_COMPAT
evutil_time: Implements usleep() using wait funtion on Windows
Initialize variable to 0 replace use memset function in sample/hello-world.c
cmake: set CMAKE_{RUNTIME,LIBRARY,ARCHIVE}_OUTPUT_DIRECTORY they are not defined
cmake: use CMAKE_LIBRARY_OUTPUT_DIRECTORY for the final shared library symlink
test-ratelim: calculate timers bias (for slow CPUs) to avoid false-positive
mailmap: add name/email aliases for yuangongji (name and email)
cmake: test for find_package()
cmake: improve package config file
Link with iphlpapi only on windows
Parse IPv6 scope IDs.
Relax bufferevent_connect_hostname_emfile
autotools: fails build when need but can not find openssl
cmake: eliminate duplicate installation of public headers
append to CMAKE_MODULE_PATH
Do not use sysctl.h on linux (it had been deprecated)
sample/https-client: link crypt32 explicitly when build with mingw-w64
Fix compat with NetBSD >= 10
Avoid transforming base C_FLAGS set deliberately
tinytest: support timeout on Windows
Merge branch 'upstream/pr/899' (evbuffer_freeze testcase enhancements)
evbuffer_add_file: fix freeing of segment in the error path
evutil_time: detect and use _gmtime64_s()/_gmtime64()
http: rename bind_socket_ai() to create_bind_socket_nonblock()
https-client: load certificates from the system cert store on Windows
Fix checking return value of the evdns_base_resolv_conf_parse()
cmake: fix getrandom() detection
arc4random: replace sysctl() with getrandom (on linux)
Upgrade autoconf (after upgrading minimum required to 2.67)
Revert "Warn if forked from the event loop during event_reinit()"
eliminate some C4267 warnings in Windows
autotools: attach doxygen target into all target
cmake: attach doxygen target into all target
Fix memory corruption in EV_CLOSURE_EVENT_FINALIZE with debug enabled
test: prevent duplicate event_enable_debug_mode() for TT_ENABLE_DEBUG_MODE
test: introduce TT_ENABLE_DEBUG_MODE flag
sample/http-server: fix parameter parsing
sample/signal-test: fix use of uninitialized variable
Fix typos in comments (sample/test/event-internal.h)
sample/signal-test: add NULL checks
Change the minimum version of automake to 1.13 and autoconf to 2.67
Add Uninstall.cmake.in into dist archive
Diffstat (limited to 'evutil.c')
-rw-r--r-- | evutil.c | 54 |
1 files changed, 50 insertions, 4 deletions
@@ -41,6 +41,7 @@ /* For structs needed by GetAdaptersAddresses */ #define _WIN32_WINNT 0x0501 #include <iphlpapi.h> +#include <netioapi.h> #endif #include <sys/types.h> @@ -74,6 +75,9 @@ #endif #include <time.h> #include <sys/stat.h> +#ifndef _WIN32 +#include <net/if.h> +#endif #ifdef EVENT__HAVE_IFADDRS_H #include <ifaddrs.h> #endif @@ -694,7 +698,7 @@ evutil_check_ifaddrs(void) "GetAdaptersInfo", but that's deprecated; let's just try GetAdaptersAddresses and fall back to connect+getsockname. */ - HMODULE lib = evutil_load_windows_system_library_(TEXT("ihplapi.dll")); + HMODULE lib = evutil_load_windows_system_library_(TEXT("iphlpapi.dll")); GetAdaptersAddresses_fn_t fn; ULONG size, res; IP_ADAPTER_ADDRESSES *addresses = NULL, *address; @@ -990,6 +994,7 @@ evutil_getaddrinfo_common_(const char *nodename, const char *servname, struct evutil_addrinfo *hints, struct evutil_addrinfo **res, int *portnum) { int port = 0; + unsigned int if_index; const char *pname; if (nodename == NULL && servname == NULL) @@ -1063,10 +1068,12 @@ evutil_getaddrinfo_common_(const char *nodename, const char *servname, if (hints->ai_family == PF_INET6 || hints->ai_family == PF_UNSPEC) { struct sockaddr_in6 sin6; memset(&sin6, 0, sizeof(sin6)); - if (1==evutil_inet_pton(AF_INET6, nodename, &sin6.sin6_addr)) { + if (1 == evutil_inet_pton_scope( + AF_INET6, nodename, &sin6.sin6_addr, &if_index)) { /* Got an ipv6 address. */ sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(port); + sin6.sin6_scope_id = if_index; *res = evutil_new_addrinfo_((struct sockaddr*)&sin6, sizeof(sin6), hints); if (!*res) @@ -1982,6 +1989,41 @@ evutil_inet_ntop(int af, const void *src, char *dst, size_t len) } int +evutil_inet_pton_scope(int af, const char *src, void *dst, unsigned *indexp) +{ + int r; + unsigned if_index; + char *check, *cp, *tmp_src; + + *indexp = 0; /* Reasonable default */ + + /* Bail out if not IPv6 */ + if (af != AF_INET6) + return evutil_inet_pton(af, src, dst); + + cp = strchr(src, '%'); + + /* Bail out if no zone ID */ + if (cp == NULL) + return evutil_inet_pton(af, src, dst); + + if_index = if_nametoindex(cp + 1); + if (if_index == 0) { + /* Could be numeric */ + if_index = strtoul(cp + 1, &check, 10); + if (check[0] != '\0') + return 0; + } + *indexp = if_index; + tmp_src = mm_strdup(src); + cp = strchr(tmp_src, '%'); + *cp = '\0'; + r = evutil_inet_pton(af, tmp_src, dst); + free(tmp_src); + return r; +} + +int evutil_inet_pton(int af, const char *src, void *dst) { #if defined(EVENT__HAVE_INET_PTON) && !defined(USE_INTERNAL_PTON) @@ -2097,6 +2139,7 @@ int evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int *outlen) { int port; + unsigned int if_index; char buf[128]; const char *cp, *addr_part, *port_part; int is_ipv6; @@ -2166,10 +2209,13 @@ evutil_parse_sockaddr_port(const char *ip_as_string, struct sockaddr *out, int * #endif sin6.sin6_family = AF_INET6; sin6.sin6_port = htons(port); - if (1 != evutil_inet_pton(AF_INET6, addr_part, &sin6.sin6_addr)) + if (1 != evutil_inet_pton_scope( + AF_INET6, addr_part, &sin6.sin6_addr, &if_index)) { return -1; + } if ((int)sizeof(sin6) > *outlen) return -1; + sin6.sin6_scope_id = if_index; memset(out, 0, *outlen); memcpy(out, &sin6, sizeof(sin6)); *outlen = sizeof(sin6); @@ -2323,7 +2369,7 @@ static const unsigned char EVUTIL_TOLOWER_TABLE[256] = { #define IMPL_CTYPE_FN(name) \ int EVUTIL_##name##_(char c) { \ ev_uint8_t u = c; \ - return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1 << (u & 31))); \ + return !!(EVUTIL_##name##_TABLE[(u >> 5) & 7] & (1U << (u & 31))); \ } IMPL_CTYPE_FN(ISALPHA) IMPL_CTYPE_FN(ISALNUM) |