| From 07c15a02f6890f56aa0b9341c27fc889956ab114 Mon Sep 17 00:00:00 2001 |
| From: rofl0r <rofl0r@users.noreply.github.com> |
| 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 |
| |
| [Retrieved from: |
| https://github.com/rofl0r/proxychains-ng/commit/07c15a02f6890f56aa0b9341c27fc889956ab114] |
| Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com> |
| --- |
| 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 <netdb.h>\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 <netdb.h>\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 <netdb.h>\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 <netdb.h>\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 <netdb.h>\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(); |