From 07c15a02f6890f56aa0b9341c27fc889956ab114 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Tue, 25 Jan 2022 14:51:27 +0000 Subject: [PATCH] add configure check for non-POSIX compliant getnameinfo signature - glibc < 2.14 uses "unsigned" instead of "int" for flags - openbsd and freebsd use "size_t" instead of socklen_t for servlen and nodelen, while still using socklen_t for salen. closes #430 --- configure | 16 ++++++++++++++++ src/core.h | 2 +- src/libproxychains.c | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 4c8bcbc..0102eb2 100755 --- a/configure +++ b/configure @@ -175,6 +175,22 @@ ishaiku() { check_compile 'whether C compiler works' '' 'int main() {return 0;}' || fail 'error: install a C compiler and library' +if ! check_compile 'whether getnameinfo() servlen argument is POSIX compliant (socklen_t)' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=socklen_t -DGN_FLAGS_T=int" \ +'#define _GNU_SOURCE\n#include \nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int);int main() {\nreturn 0;}' ; then + # GLIBC < 2.14 + if ! check_compile 'whether getnameinfo() flags argument is unsigned' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=socklen_t -DGN_FLAGS_T=unsigned" \ + '#define _GNU_SOURCE\n#include \nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, unsigned);int main() {\nreturn 0;}' ; then + if ! check_compile 'whether getnameinfo() servlen argument is size_t' "-DGN_NODELEN_T=socklen_t -DGN_SERVLEN_T=size_t -DGN_FLAGS_T=int" \ + '#define _GNU_SOURCE\n#include \nint getnameinfo(const struct sockaddr *, socklen_t, char *, socklen_t, char *, size_t, int);int main() {\nreturn 0;}' ; then + # OpenBSD & FreeBSD + if ! check_compile 'whether getnameinfo() servlen and nodelen argument is size_t' "-DGN_NODELEN_T=size_t -DGN_SERVLEN_T=size_t -DGN_FLAGS_T=int" \ + '#define _GNU_SOURCE\n#include \nint getnameinfo(const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int);int main() {\nreturn 0;}' ; then + fail "failed to detect getnameinfo signature" + fi + fi + fi +fi + check_compile 'whether we have GNU-style getservbyname_r()' "-DHAVE_GNU_GETSERVBYNAME_R" \ '#define _GNU_SOURCE\n#include \nint main() {\nstruct servent *se = 0;struct servent se_buf;char buf[1024];\ngetservbyname_r("foo", (void*) 0, &se_buf, buf, sizeof(buf), &se);\nreturn 0;}' diff --git a/src/core.h b/src/core.h index 31f3003..3045b86 100644 --- a/src/core.h +++ b/src/core.h @@ -109,7 +109,7 @@ typedef int (*getaddrinfo_t)(const char *, const char *, const struct addrinfo * struct addrinfo **); typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *, - socklen_t, char *, socklen_t, int); + GN_NODELEN_T, char *, GN_SERVLEN_T, GN_FLAGS_T); typedef ssize_t (*sendto_t) (int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); diff --git a/src/libproxychains.c b/src/libproxychains.c index 001ffcd..578ff84 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -729,8 +729,8 @@ HOOKFUNC(void, freeaddrinfo, struct addrinfo *res) { } HOOKFUNC(int, getnameinfo, const struct sockaddr *sa, socklen_t salen, - char *host, socklen_t hostlen, char *serv, - socklen_t servlen, int flags) + char *host, GN_NODELEN_T hostlen, char *serv, + GN_SERVLEN_T servlen, GN_FLAGS_T flags) { INIT(); PFUNC();