Hello community,

here is the log from the commit of package proxychains-ng for openSUSE:Factory 
checked in at 2015-05-29 10:41:18
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/proxychains-ng (Old)
 and      /work/SRC/openSUSE:Factory/.proxychains-ng.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "proxychains-ng"

Changes:
--------
--- /work/SRC/openSUSE:Factory/proxychains-ng/proxychains-ng.changes    
2015-01-08 23:01:25.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.proxychains-ng.new/proxychains-ng.changes       
2015-05-29 10:41:19.000000000 +0200
@@ -1,0 +2,10 @@
+Thu May 28 07:29:41 UTC 2015 - [email protected]
+
+- Update to 4.9, announce message:
+
+ - fix a security issue CVE-2015-3887
+ - add sendto hook to handle MSG_FASTOPEN flag
+ - replace problematic hostentdb with hostsreader
+ - fix compilation on OpenBSD (although doesn't work there)
+
+-------------------------------------------------------------------

Old:
----
  proxychains-4.8.1.tar.bz2

New:
----
  proxychains-4.9.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ proxychains-ng.spec ++++++
--- /var/tmp/diff_new_pack.pns8pm/_old  2015-05-29 10:41:20.000000000 +0200
+++ /var/tmp/diff_new_pack.pns8pm/_new  2015-05-29 10:41:20.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package proxychains-ng
 #
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           proxychains-ng
-Version:        4.8.1
+Version:        4.9
 Release:        0
 Summary:        Redirect connection through proxy servers
 License:        GPL-2.0

++++++ proxychains-4.8.1.tar.bz2 -> proxychains-4.9.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/COPYING new/proxychains-4.9/COPYING
--- old/proxychains-4.8.1/COPYING       2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/COPYING 2015-05-28 08:36:44.000000000 +0200
@@ -1,8 +1,8 @@
                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991
 
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, USA
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/Makefile 
new/proxychains-4.9/Makefile
--- old/proxychains-4.8.1/Makefile      2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/Makefile        2015-05-28 08:36:44.000000000 +0200
@@ -18,14 +18,14 @@
 LOBJS = src/nameinfo.o src/version.o \
         src/core.o src/common.o src/libproxychains.o src/shm.o \
         src/allocator_thread.o src/ip_type.o src/stringdump.o \
-        src/hostentdb.o src/hash.o src/debug.o
+        src/hostsreader.o src/hash.o src/debug.o
 
 GENH = src/version.h
 
 CFLAGS  += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe
 NO_AS_NEEDED = -Wl,--no-as-needed
 LIBDL   = -ldl
-LDFLAGS = -shared -fPIC $(NO_AS_NEEDED) $(LIBDL) -lpthread
+LDFLAGS = -fPIC $(NO_AS_NEEDED)
 INC     = 
 PIC     = -fPIC
 AR      = $(CROSS_COMPILE)ar
@@ -46,6 +46,7 @@
 -include config.mak
 
 CFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS)
+LDFLAGS+=$(USER_LDFLAGS)
 CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DSYSCONFDIR=\"$(sysconfdir)\" 
-DDLL_NAME=\"$(LDSO_PATHNAME)\"
 
 
@@ -81,10 +82,10 @@
        $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_MAIN) $(INC) $(PIC) -c -o $@ $<
 
 $(LDSO_PATHNAME): $(LOBJS)
-       $(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -o $@ $(LOBJS)
+       $(CC) -shared $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -lpthread 
$(LIBDL) -o $@ $(LOBJS)
 
 $(ALL_TOOLS): $(OBJS)
-       $(CC) src/main.o src/common.o -o $(PXCHAINS)
+       $(CC) $(LDFLAGS) src/main.o src/common.o -o $(PXCHAINS)
 
 
 .PHONY: all clean install install-config install-libs install-tools
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/README new/proxychains-4.9/README
--- old/proxychains-4.8.1/README        2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/README  2015-05-28 08:36:44.000000000 +0200
@@ -1,4 +1,4 @@
-ProxyChains-NG ver 4.8 README
+ProxyChains-NG ver 4.9 README
 =============================
 
   ProxyChains is a UNIX program, that hooks network-related libc functions
@@ -52,6 +52,12 @@
 
 Changelog:
 ----------
+Version 4.9
+- fix a security issue CVE-2015-3887
+- add sendto hook to handle MSG_FASTOPEN flag
+- replace problematic hostentdb with hostsreader
+- fix compilation on OpenBSD (although doesn't work there)
+
 Version 4.8.1:
 - fix regression in 4.8 install-config Makefile target
 
@@ -69,9 +75,11 @@
 - return EBADF rather than EINTR in close hook. 
   it's legal for a program to retry close() calls when they receive
   EINTR, which could cause an infinite loop, as seen in chromium.
+
 Version 4.6:
 - some cosmetic fixes to Makefile, fix a bug when non-numeric ip was
-  user as proxy server address.
+  used as proxy server address.
+
 Version 4.5:
 - hook close() to prevent OpenSSH from messing with internal infrastructure.
   this caused ssh client to segfault when proxified.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/VERSION new/proxychains-4.9/VERSION
--- old/proxychains-4.8.1/VERSION       2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/VERSION 2015-05-28 08:36:44.000000000 +0200
@@ -1 +1 @@
-4.8.1
+4.9
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/configure 
new/proxychains-4.9/configure
--- old/proxychains-4.8.1/configure     2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/configure       2015-05-28 08:36:44.000000000 +0200
@@ -14,6 +14,10 @@
        uname -s | grep BSD >/dev/null
 }
 
+isopenbsd() {
+       uname -s | grep OpenBSD >/dev/null
+}
+
 usage() {
        echo "supported arguments"
        echo "--prefix=/path            default: $prefix"
@@ -22,6 +26,9 @@
        echo "--libdir=/path            default: $prefix/lib"
        echo "--includedir=/path        default: $prefix/include"
        echo "--sysconfdir=/path        default: $prefix/etc"
+       echo "--ignore-cve              default: no"
+       echo "  if set to yes ignores CVE-2015-3887 and makes it possible"
+       echo "  to preload from current dir (insecure)"
        ismac && isx86_64 && echo "--fat-binary : build for both i386 and 
x86_64 architectures on 64-bit Macs"
        echo "--help : show this text"
        exit 1
@@ -35,7 +42,7 @@
 }
 
 fat_binary=
-
+ignore_cve=no
 parsearg() {
        case "$1" in
        --prefix=*) prefix=`spliteq $1`;;
@@ -44,6 +51,8 @@
        --libdir=*) libdir=`spliteq $1`;;
        --includedir=*) includedir=`spliteq $1`;;
        --sysconfdir=*) sysconfdir=`spliteq $1`;;
+       --ignore-cve) ignore_cve=1;;
+       --ignore-cve=*) ignore_cve=`spliteq $1`;;
        --fat-binary) fat_binary=1;;
        --help) usage;;
        esac
@@ -83,12 +92,14 @@
 echo CC?=$CC>config.mak
 [ -z "$CPPFLAGS" ] || echo CPPFLAGS?=$CPPFLAGS>>config.mak
 [ -z "$CFLAGS" ] || echo USER_CFLAGS?=$CFLAGS>>config.mak
+[ -z "$LDFLAGS" ] || echo USER_LDFLAGS?=$LDFLAGS>>config.mak
 echo prefix=$prefix>>config.mak
 echo exec_prefix=$exec_prefix>>config.mak
 echo bindir=$bindir>>config.mak
 echo libdir=$libdir>>config.mak
 echo includedir=$includedir>>config.mak
 echo sysconfdir=$sysconfdir>>config.mak
+[ "$ignore_cve" = "no" ] && echo CPPFLAGS+= -DSUPER_SECURE>>config.mak
 make_cmd=make
 if ismac ; then
        echo NO_AS_NEEDED=>>config.mak
@@ -103,6 +114,7 @@
 elif isbsd ; then
        echo LIBDL=>>config.mak
        echo "CFLAGS+=-DIS_BSD">>config.mak
+       isopenbsd && echo "CFLAGS+=-DIS_OPENBSD">>config.mak
        make_cmd=gmake
 fi
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/core.c 
new/proxychains-4.9/src/core.c
--- old/proxychains-4.8.1/src/core.c    2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/src/core.c      2015-05-28 08:36:44.000000000 +0200
@@ -719,11 +719,7 @@
        return -1;
 }
 
-#include "hostentdb.h"
-struct hostent_list hl;
-
 void core_initialize(void) {
-       hdb_init(&hl);
 }
 
 void core_unload(void) {
@@ -734,6 +730,7 @@
        data->hostent_space.h_name = data->addr_name;
 }
 
+extern ip_type hostsreader_get_numeric_ip_for_name(const char* name);
 struct hostent *proxy_gethostbyname(const char *name, struct 
gethostbyname_data* data) {
        PFUNC();
        char buff[256];
@@ -758,10 +755,8 @@
                goto retname;
        }
 
-       memset(buff, 0, sizeof(buff));
-
        // this iterates over the "known hosts" db, usually /etc/hosts
-       ip_type hdb_res = hdb_get(&hl, (char*) name);
+       ip_type hdb_res = hostsreader_get_numeric_ip_for_name(name);
        if(hdb_res.as_int != ip_type_invalid.as_int) {
                data->resolved_addr = hdb_res.as_int;
                goto retname;
@@ -790,8 +785,12 @@
        free(res);
 }
 
-#ifdef IS_MAC
-/* getservbyname on mac is using thread local storage, so we dont need mutex */
+#if defined(IS_MAC) || defined(IS_OPENBSD)
+#ifdef IS_OPENBSD /* OpenBSD has its own incompatible getservbyname_r */
+#define getservbyname_r mygetservbyname_r
+#endif
+/* getservbyname on mac is using thread local storage, so we dont need mutex 
+   TODO: check if the same applies to OpenBSD */
 static int getservbyname_r(const char* name, const char* proto, struct 
servent* result_buf, 
                           char* buf, size_t buflen, struct servent** result) {
        PFUNC();
@@ -858,6 +857,9 @@
                p->ai_flags = hints->ai_flags;
                p->ai_protocol = hints->ai_protocol;
        } else {
+#ifndef AI_V4MAPPED
+#define AI_V4MAPPED 0
+#endif
                p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/core.h 
new/proxychains-4.9/src/core.h
--- old/proxychains-4.8.1/src/core.h    2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/src/core.h      2015-05-28 08:36:44.000000000 +0200
@@ -95,6 +95,10 @@
 typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *, 
                              socklen_t, char *, socklen_t, int);
 
+typedef ssize_t (*sendto_t) (int sockfd, const void *buf, size_t len, int 
flags,
+                            const struct sockaddr *dest_addr, socklen_t 
addrlen);
+
+
 
 extern connect_t true_connect;
 extern gethostbyname_t true_gethostbyname;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/hostentdb.c 
new/proxychains-4.9/src/hostentdb.c
--- old/proxychains-4.8.1/src/hostentdb.c       2014-07-22 17:23:21.000000000 
+0200
+++ new/proxychains-4.9/src/hostentdb.c 1970-01-01 01:00:00.000000000 +0100
@@ -1,63 +0,0 @@
-#include <stdint.h>
-#include <string.h>
-#include <netdb.h>
-#include <stdlib.h>
-#include <netinet/in.h>
-#include <sys/socket.h>
-
-#include "ip_type.h"
-#include "hash.h"
-#include "stringdump.h"
-#include "hostentdb.h"
-#include "common.h"
-#include "debug.h"
-
-#define STEP 16
-static void hdb_add(struct hostent_list* hl, char* host, ip_type ip) {
-       if(hl->count +1 > hl->capa) {
-               void * nu = realloc(hl->entries, (hl->capa + STEP) * 
sizeof(struct hostent_entry));
-               if(!nu) return;
-               hl->entries = nu;
-               hl->capa += STEP;
-       }
-       struct hostent_entry *h = &hl->entries[hl->count];
-       h->hash = dalias_hash(host);
-       h->ip.as_int = ip.as_int;
-       h->str = dumpstring(host, strlen(host) + 1); 
-       if(h->str) hl->count++;
-}
-
-static void hdb_fill(struct hostent_list *hl) {
-#ifndef IS_BSD
-       struct hostent* hp;
-       while((hp = gethostent()))
-               if(hp->h_addrtype == AF_INET && hp->h_length == 
sizeof(in_addr_t)) {
-                       hdb_add(hl, hp->h_name, (ip_type) { .as_int = 
*((in_addr_t*)(hp->h_addr_list[0])) });
-               }
-#else
-       /* FreeBSD hangs on gethostent(). since this feature is not crucial, we 
just do nothing */
-       (void) hl;
-#endif
-}
-
-void hdb_init(struct hostent_list *hl) {
-       memset(hl, 0, sizeof *hl);
-       hdb_fill(hl);
-}
-
-ip_type hdb_get(struct hostent_list *hl, char* host) {
-       size_t i;
-       PFUNC();
-       uint32_t hash = dalias_hash(host);
-       for(i = 0; i < hl->count; i++) {
-               if(hl->entries[i].hash == hash && !strcmp(hl->entries[i].str, 
host)) {
-               #ifdef DEBUG
-                       char ipbuf[16];
-                       pc_stringfromipv4(hl->entries[i].ip.octet, ipbuf);
-                       PDEBUG("got ip %s for hostent entry %s\n", ipbuf, host);
-               #endif
-                       return hl->entries[i].ip;
-               }
-       }
-       return ip_type_invalid;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/hostentdb.h 
new/proxychains-4.9/src/hostentdb.h
--- old/proxychains-4.8.1/src/hostentdb.h       2014-07-22 17:23:21.000000000 
+0200
+++ new/proxychains-4.9/src/hostentdb.h 1970-01-01 01:00:00.000000000 +0100
@@ -1,23 +0,0 @@
-#ifndef HOSTENTDB_H
-#define HOSTENTDB_H
-
-#include "ip_type.h"
-#include <unistd.h>
-
-struct hostent_entry {
-       uint32_t hash;
-       ip_type ip;
-       char* str;
-};
-
-struct hostent_list {
-       size_t count;
-       size_t capa;
-       struct hostent_entry *entries;
-};
-
-void hdb_init(struct hostent_list *hl);
-ip_type hdb_get(struct hostent_list *hl, char* host);
-
-//RcB: DEP "hostendb.c"
-#endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/hostsreader.c 
new/proxychains-4.9/src/hostsreader.c
--- old/proxychains-4.8.1/src/hostsreader.c     1970-01-01 01:00:00.000000000 
+0100
+++ new/proxychains-4.9/src/hostsreader.c       2015-05-28 08:36:44.000000000 
+0200
@@ -0,0 +1,121 @@
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+/*
+   simple reader for /etc/hosts
+   it only supports comments, blank lines and lines consisting of an ipv4 
hostname pair.
+   this is required so we can return entries from the host db without messing 
up the
+   non-thread-safe state of libc's gethostent().
+
+*/
+
+struct hostsreader {
+       FILE *f;
+       char* ip, *name;
+};
+
+int hostsreader_open(struct hostsreader *ctx) {
+       if(!(ctx->f = fopen("/etc/hosts", "r"))) return 0;
+       return 1;
+}
+
+void hostsreader_close(struct hostsreader *ctx) {
+       fclose(ctx->f);
+}
+
+static int isnumericipv4(const char* ipstring);
+int hostsreader_get(struct hostsreader *ctx, char* buf, size_t bufsize) {
+       while(1) {
+               if(!fgets(buf, bufsize, ctx->f)) return 0;
+               if(*buf == '#') continue;
+               char *p = buf;
+               size_t l = bufsize;
+               ctx->ip = p;
+               while(*p && !isspace(*p) && l) {
+                       p++;
+                       l--;
+               }
+               if(!l || !*p || p == ctx->ip) continue;
+               *p = 0;
+               p++;
+               while(*p && isspace(*p) && l) {
+                       p++;
+                       l--;
+               }
+               if(!l || !*p) continue;
+               ctx->name = buf;
+               while(*p && !isspace(*p) && l) {
+                       p++;
+                       l--;
+               }
+               if(!l || !*p) continue;
+               *p = 0;
+               if(isnumericipv4(ctx->ip)) return 1;
+       }
+}
+
+char* hostsreader_get_ip_for_name(const char* name, char* buf, size_t bufsize) 
{
+       struct hostsreader ctx;
+       char *res = 0;
+       if(!hostsreader_open(&ctx)) return 0;
+       while(hostsreader_get(&ctx, buf, bufsize)) {
+               if(!strcmp(ctx.name, name)) {
+                       res = ctx.ip;
+                       break;
+               }
+       }
+       hostsreader_close(&ctx);
+       return res;
+}
+
+#include "ip_type.h"
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+ip_type hostsreader_get_numeric_ip_for_name(const char* name) {
+       char *hres;
+       char buf[320];
+       if((hres = hostsreader_get_ip_for_name(name, buf, sizeof buf))) {
+               struct in_addr c;
+               inet_aton(hres, &c);
+               ip_type res;
+               memcpy(res.octet, &c.s_addr, 4);
+               return res;
+       } else return ip_type_invalid;
+}
+
+#ifdef HOSTSREADER_TEST
+int main() {
+       char buf[256];
+       char * ret = hostsreader_get_ip_for_name("goo", buf, sizeof buf);
+       printf("%s\n", ret ? ret : "null");
+}
+#endif
+
+/* isnumericipv4() taken from libulz */
+static int isnumericipv4(const char* ipstring) {
+       size_t x = 0, n = 0, d = 0;
+       int wasdot = 0;
+       while(1) {
+               switch(ipstring[x]) {
+                       case 0: goto done;
+                       case '.':
+                               if(!n || wasdot) return 0;
+                               d++;
+                               wasdot = 1;
+                               break;
+                       case '0': case '1': case '2': case '3': case '4':
+                       case '5': case '6': case '7': case '8': case '9':
+                               n++;
+                               wasdot = 0;
+                               break;
+                       default:
+                               return 0;
+               }
+               x++;
+       }
+       done:
+       if(d == 3 && n >= 4 && n <= 12) return 1;
+       return 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/libproxychains.c 
new/proxychains-4.9/src/libproxychains.c
--- old/proxychains-4.8.1/src/libproxychains.c  2014-07-22 17:23:21.000000000 
+0200
+++ new/proxychains-4.9/src/libproxychains.c    2015-05-28 08:36:44.000000000 
+0200
@@ -52,6 +52,7 @@
 freeaddrinfo_t true_freeaddrinfo;
 getnameinfo_t true_getnameinfo;
 gethostbyaddr_t true_gethostbyaddr;
+sendto_t true_sendto;
 
 int tcp_read_time_out;
 int tcp_connect_time_out;
@@ -113,6 +114,7 @@
        proxychains_write_log(LOG_PREFIX "DLL init: proxychains-ng %s\n", 
proxychains_get_version());
 
        SETUP_SYM(connect);
+       SETUP_SYM(sendto);
        SETUP_SYM(gethostbyname);
        SETUP_SYM(getaddrinfo);
        SETUP_SYM(freeaddrinfo);
@@ -479,3 +481,20 @@
        }
        return NULL;
 }
+
+#ifndef MSG_FASTOPEN
+#   define MSG_FASTOPEN 0x20000000
+#endif
+
+ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
+              const struct sockaddr *dest_addr, socklen_t addrlen) {
+       if (flags & MSG_FASTOPEN) {
+               if (!connect(sockfd, dest_addr, addrlen) && errno != 
EINPROGRESS) {
+                       return -1;
+               }
+               dest_addr = NULL;
+               addrlen = 0;
+               flags &= ~MSG_FASTOPEN;
+       }
+       return true_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/src/main.c 
new/proxychains-4.9/src/main.c
--- old/proxychains-4.8.1/src/main.c    2014-07-22 17:23:21.000000000 +0200
+++ new/proxychains-4.9/src/main.c      2015-05-28 08:36:44.000000000 +0200
@@ -33,7 +33,9 @@
 
 static char own_dir[256];
 static const char *dll_dirs[] = {
+#ifndef SUPER_SECURE /* CVE-2015-3887 */
        ".",
+#endif
        own_dir,
        LIB_DIR,
        "/lib",
@@ -48,7 +50,11 @@
        while(l && argv0[l - 1] != '/')
                l--;
        if(l == 0)
+#ifdef SUPER_SECURE
+               memcpy(own_dir, "/dev/null/", 11);
+#else
                memcpy(own_dir, ".", 2);
+#endif
        else {
                memcpy(own_dir, argv0, l - 1);
                own_dir[l] = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/proxychains-4.8.1/tests/test_sendto.c 
new/proxychains-4.9/tests/test_sendto.c
--- old/proxychains-4.8.1/tests/test_sendto.c   1970-01-01 01:00:00.000000000 
+0100
+++ new/proxychains-4.9/tests/test_sendto.c     2015-05-28 08:36:44.000000000 
+0200
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#ifndef MSG_FASTOPEN
+#   define MSG_FASTOPEN 0x20000000
+#endif
+
+void error(const char *msg)
+{
+       perror(msg);
+       exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+       if (argc < 4) {
+               printf("Usage: %s host port method(connect or sendto)\n", 
argv[0]);
+               return 1;
+       }
+       const char *hostname = argv[1];
+       const int portno = atoi(argv[2]);
+       const char *method = argv[3];
+       char request[BUFSIZ];
+       sprintf(request, "GET / HTTP/1.0\r\nHost: %s\r\n\r\n", hostname);
+       int sockfd, n;
+       struct sockaddr_in serv_addr;
+       struct hostent *server;
+
+       char buffer[BUFSIZ];
+       sockfd = socket(AF_INET, SOCK_STREAM, 0);
+       if (sockfd < 0) error("ERROR opening socket");
+       server = gethostbyname(hostname);
+       if (server == NULL) {
+               fprintf(stderr, "%s: no such host\n", hostname);
+               return 1;
+       }
+       memset(&serv_addr, 0, sizeof(serv_addr));
+       serv_addr.sin_family = AF_INET;
+       memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
+       serv_addr.sin_port = htons(portno);
+       if (!strcmp(method, "connect")) {
+         if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) 
< 0)
+                 error("connect");
+         n = send(sockfd, request, strlen(request), 0);
+       } else if (!strcmp(method, "sendto")) {
+         n = sendto(sockfd, request, strlen(request), MSG_FASTOPEN, (struct 
sockaddr *)&serv_addr, sizeof(serv_addr));
+       } else {
+         printf("Unknown method %s\n", method);
+         return 1;
+       }
+       if (n < 0)
+                error("send");
+       memset(buffer, 0, BUFSIZ);
+       n = read(sockfd, buffer, BUFSIZ - 1);
+       if (n < 0)
+                error("ERROR reading from socket");
+       printf("%s\n", buffer);
+       close(sockfd);
+       return 0;
+}


Reply via email to