summaryrefslogtreecommitdiff
path: root/evutil.c
diff options
context:
space:
mode:
authorAzat Khuzhin <azat@libevent.org>2020-07-05 15:01:34 +0300
committerAzat Khuzhin <azat@libevent.org>2020-07-05 15:02:46 +0300
commit5df3037d10556bfcb675bc73e516978b75fc7bc7 (patch)
tree9b59b8aec360426931f641d0e58fe57d2e442bad /evutil.c
parent4c908dde58ef780eeefcc9df4db3063ca62ea862 (diff)
parent1324a03c125faa9404c91dbecec540a681a97367 (diff)
downloadlibevent-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.c54
1 files changed, 50 insertions, 4 deletions
diff --git a/evutil.c b/evutil.c
index 3412c2ae..9817f086 100644
--- a/evutil.c
+++ b/evutil.c
@@ -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)