Hello community,

here is the log from the commit of package shadowsocks-libev for 
openSUSE:Factory checked in at 2018-01-22 16:18:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/shadowsocks-libev (Old)
 and      /work/SRC/openSUSE:Factory/.shadowsocks-libev.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "shadowsocks-libev"

Mon Jan 22 16:18:49 2018 rev:4 rq:567907 version:3.1.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/shadowsocks-libev/shadowsocks-libev.changes      
2018-01-02 16:34:51.391100127 +0100
+++ /work/SRC/openSUSE:Factory/.shadowsocks-libev.new/shadowsocks-libev.changes 
2018-01-22 16:20:44.167710399 +0100
@@ -1,0 +2,6 @@
+Sat Jan 20 14:02:33 UTC 2018 - [email protected]
+
+- Update version to 3.1.3
+  * Fix a bug in UDP relay.
+
+-------------------------------------------------------------------

Old:
----
  shadowsocks-libev-3.1.2.tar.gz

New:
----
  shadowsocks-libev-3.1.3.tar.gz

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

Other differences:
------------------
++++++ shadowsocks-libev.spec ++++++
--- /var/tmp/diff_new_pack.T6xHXM/_old  2018-01-22 16:20:44.827679531 +0100
+++ /var/tmp/diff_new_pack.T6xHXM/_new  2018-01-22 16:20:44.831679343 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package shadowsocks-libev
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 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,8 +17,9 @@
 
 
 %define libver 2
+
 Name:           shadowsocks-libev
-Version:        3.1.2
+Version:        3.1.3
 Release:        0
 Summary:        Libev port of Shadowsocks
 License:        GPL-3.0+

++++++ shadowsocks-libev-3.1.2.tar.gz -> shadowsocks-libev-3.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/Changes 
new/shadowsocks-libev-3.1.3/Changes
--- old/shadowsocks-libev-3.1.2/Changes 2017-12-29 06:05:18.000000000 +0100
+++ new/shadowsocks-libev-3.1.3/Changes 2018-01-16 02:20:51.000000000 +0100
@@ -1,3 +1,9 @@
+shadowsocks-libev (3.1.3-1) unstable; urgency=medium
+
+  * Fix a bug in UDP relay.
+
+ -- Max Lv <[email protected]>  Mon, 15 Jan 2018 17:19:31 -0800
+
 shadowsocks-libev (3.1.2-1) unstable; urgency=medium
 
   * Fix a bug in DNS resolver.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/README.md 
new/shadowsocks-libev-3.1.3/README.md
--- old/shadowsocks-libev-3.1.2/README.md       2017-12-29 06:04:28.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/README.md       2018-01-16 02:17:56.000000000 
+0100
@@ -9,7 +9,7 @@
 created by [@clowwindy](https://github.com/clowwindy), and maintained by
 [@madeye](https://github.com/madeye) and 
[@linusyang](https://github.com/linusyang).
 
-Current version: 3.1.2 | [Changelog](debian/changelog)
+Current version: 3.1.3 | [Changelog](debian/changelog)
 
 Travis CI: [![Travis 
CI](https://travis-ci.org/shadowsocks/shadowsocks-libev.svg?branch=master)](https://travis-ci.org/shadowsocks/shadowsocks-libev)
 
@@ -491,7 +491,7 @@
 
 ```
 Copyright: 2013-2015, Clow Windy <[email protected]>
-           2013-2017, Max Lv <[email protected]>
+           2013-2018, Max Lv <[email protected]>
            2014, Linus Yang <[email protected]>
 
 This program is free software: you can redistribute it and/or modify
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/configure 
new/shadowsocks-libev-3.1.3/configure
--- old/shadowsocks-libev-3.1.2/configure       2017-12-29 06:04:10.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/configure       2018-01-16 02:21:31.000000000 
+0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for shadowsocks-libev 3.1.2.
+# Generated by GNU Autoconf 2.69 for shadowsocks-libev 3.1.3.
 #
 # Report bugs to <[email protected]>.
 #
@@ -590,8 +590,8 @@
 # Identity of this package.
 PACKAGE_NAME='shadowsocks-libev'
 PACKAGE_TARNAME='shadowsocks-libev'
-PACKAGE_VERSION='3.1.2'
-PACKAGE_STRING='shadowsocks-libev 3.1.2'
+PACKAGE_VERSION='3.1.3'
+PACKAGE_STRING='shadowsocks-libev 3.1.3'
 PACKAGE_BUGREPORT='[email protected]'
 PACKAGE_URL=''
 
@@ -1365,7 +1365,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures shadowsocks-libev 3.1.2 to adapt to many kinds of 
systems.
+\`configure' configures shadowsocks-libev 3.1.3 to adapt to many kinds of 
systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1437,7 +1437,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of shadowsocks-libev 3.1.2:";;
+     short | recursive ) echo "Configuration of shadowsocks-libev 3.1.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1572,7 +1572,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-shadowsocks-libev configure 3.1.2
+shadowsocks-libev configure 3.1.3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2095,7 +2095,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by shadowsocks-libev $as_me 3.1.2, which was
+It was created by shadowsocks-libev $as_me 3.1.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4334,7 +4334,7 @@
 
 # Define the identity of the package.
  PACKAGE='shadowsocks-libev'
- VERSION='3.1.2'
+ VERSION='3.1.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -16957,7 +16957,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by shadowsocks-libev $as_me 3.1.2, which was
+This file was extended by shadowsocks-libev $as_me 3.1.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -17023,7 +17023,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-shadowsocks-libev config.status 3.1.2
+shadowsocks-libev config.status 3.1.3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/configure.ac 
new/shadowsocks-libev-3.1.3/configure.ac
--- old/shadowsocks-libev-3.1.2/configure.ac    2017-12-29 05:54:37.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/configure.ac    2018-01-16 02:17:13.000000000 
+0100
@@ -2,7 +2,7 @@
 dnl Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.67])
-AC_INIT([shadowsocks-libev], [3.1.2], [[email protected]])
+AC_INIT([shadowsocks-libev], [3.1.3], [[email protected]])
 AC_CONFIG_SRCDIR([src/crypto.c])
 AC_CONFIG_HEADERS([config.h])
 AC_CONFIG_AUX_DIR(auto)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/debian/changelog 
new/shadowsocks-libev-3.1.3/debian/changelog
--- old/shadowsocks-libev-3.1.2/debian/changelog        2017-12-29 
06:03:08.000000000 +0100
+++ new/shadowsocks-libev-3.1.3/debian/changelog        2018-01-16 
02:20:29.000000000 +0100
@@ -1,3 +1,9 @@
+shadowsocks-libev (3.1.3-1) unstable; urgency=medium
+
+  * Fix a bug in UDP relay.
+
+ -- Max Lv <[email protected]>  Mon, 15 Jan 2018 17:19:31 -0800
+
 shadowsocks-libev (3.1.2-1) unstable; urgency=medium
 
   * Fix a bug in DNS resolver.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/docker/alpine/Dockerfile 
new/shadowsocks-libev-3.1.3/docker/alpine/Dockerfile
--- old/shadowsocks-libev-3.1.2/docker/alpine/Dockerfile        2017-12-29 
06:01:52.000000000 +0100
+++ new/shadowsocks-libev-3.1.3/docker/alpine/Dockerfile        2018-01-16 
02:20:47.000000000 +0100
@@ -5,7 +5,7 @@
 FROM alpine
 MAINTAINER kev <[email protected]>
 
-ARG SS_VER=3.1.2
+ARG SS_VER=3.1.3
 ARG 
SS_URL=https://github.com/shadowsocks/shadowsocks-libev/releases/download/v$SS_VER/shadowsocks-libev-$SS_VER.tar.gz
 
 ENV SERVER_ADDR 0.0.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/libbloom/Makefile 
new/shadowsocks-libev-3.1.3/libbloom/Makefile
--- old/shadowsocks-libev-3.1.2/libbloom/Makefile       2017-12-29 
06:04:42.000000000 +0100
+++ new/shadowsocks-libev-3.1.3/libbloom/Makefile       2018-01-16 
02:21:41.000000000 +0100
@@ -239,10 +239,10 @@
 PACKAGE = shadowsocks-libev
 PACKAGE_BUGREPORT = [email protected]
 PACKAGE_NAME = shadowsocks-libev
-PACKAGE_STRING = shadowsocks-libev 3.1.2
+PACKAGE_STRING = shadowsocks-libev 3.1.3
 PACKAGE_TARNAME = shadowsocks-libev
 PACKAGE_URL = 
-PACKAGE_VERSION = 3.1.2
+PACKAGE_VERSION = 3.1.3
 PATH_SEPARATOR = :
 PCRE_CONFIG = pcre-config
 PTHREAD_CC = gcc
@@ -253,7 +253,7 @@
 SET_MAKE = 
 SHELL = /bin/bash
 STRIP = strip
-VERSION = 3.1.2
+VERSION = 3.1.3
 XMLTO = /usr/bin/xmlto
 abs_builddir = /home/max/Develop/workspace/shadowsocks-libev/libbloom
 abs_srcdir = /home/max/Develop/workspace/shadowsocks-libev/libbloom
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/Makefile.am 
new/shadowsocks-libev-3.1.3/src/Makefile.am
--- old/shadowsocks-libev-3.1.2/src/Makefile.am 2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/Makefile.am 2018-01-16 02:18:57.000000000 
+0100
@@ -22,8 +22,10 @@
 bin_PROGRAMS = ss-local ss-tunnel ss-server ss-manager
 
 sni_src = http.c \
-          tls.c \
-          rule.c
+          tls.c
+
+acl_src = rule.c \
+          acl.c
 
 crypto_src = crypto.c \
              aead.c \
@@ -38,12 +40,12 @@
                    json.c \
                    udprelay.c \
                    cache.c \
-                   acl.c \
                    netutils.c \
                    local.c \
                    $(crypto_src) \
                    $(plugin_src) \
-                   $(sni_src)
+                   $(sni_src) \
+                   $(acl_src)
 
 ss_tunnel_SOURCES = utils.c \
                     jconf.c \
@@ -61,12 +63,12 @@
                     json.c \
                     udprelay.c \
                     cache.c \
-                    acl.c \
                     resolv.c \
                     server.c \
                     $(crypto_src) \
                     $(plugin_src) \
-                    $(sni_src)
+                    $(sni_src) \
+                    ${acl_src}
 
 ss_manager_SOURCES = utils.c \
                      jconf.c \
@@ -99,8 +101,7 @@
                    udprelay.c \
                    redir.c \
                    $(crypto_src) \
-                   $(plugin_src) \
-                   $(sni_src)
+                   $(plugin_src)
 
 ss_redir_CFLAGS = $(AM_CFLAGS) -DMODULE_REDIR
 ss_redir_LDADD = $(SS_COMMON_LIBS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/Makefile.in 
new/shadowsocks-libev-3.1.3/src/Makefile.in
--- old/shadowsocks-libev-3.1.2/src/Makefile.in 2017-12-29 06:04:11.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/Makefile.in 2018-01-16 02:21:32.000000000 
+0100
@@ -162,17 +162,18 @@
        libshadowsocks_libev_la-base64.lo
 am__objects_2 = libshadowsocks_libev_la-plugin.lo
 am__objects_3 = libshadowsocks_libev_la-http.lo \
-       libshadowsocks_libev_la-tls.lo libshadowsocks_libev_la-rule.lo
-am__objects_4 = libshadowsocks_libev_la-utils.lo \
+       libshadowsocks_libev_la-tls.lo
+am__objects_4 = libshadowsocks_libev_la-rule.lo \
+       libshadowsocks_libev_la-acl.lo
+am__objects_5 = libshadowsocks_libev_la-utils.lo \
        libshadowsocks_libev_la-jconf.lo \
        libshadowsocks_libev_la-json.lo \
        libshadowsocks_libev_la-udprelay.lo \
        libshadowsocks_libev_la-cache.lo \
-       libshadowsocks_libev_la-acl.lo \
        libshadowsocks_libev_la-netutils.lo \
        libshadowsocks_libev_la-local.lo $(am__objects_1) \
-       $(am__objects_2) $(am__objects_3)
-am_libshadowsocks_libev_la_OBJECTS = $(am__objects_4)
+       $(am__objects_2) $(am__objects_3) $(am__objects_4)
+am_libshadowsocks_libev_la_OBJECTS = $(am__objects_5)
 libshadowsocks_libev_la_OBJECTS =  \
        $(am_libshadowsocks_libev_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -185,18 +186,18 @@
        $(libshadowsocks_libev_la_LDFLAGS) $(LDFLAGS) -o $@
 @BUILD_REDIRECTOR_TRUE@am__EXEEXT_1 = ss-redir$(EXEEXT)
 PROGRAMS = $(bin_PROGRAMS)
-am__objects_5 = ss_local-crypto.$(OBJEXT) ss_local-aead.$(OBJEXT) \
+am__objects_6 = ss_local-crypto.$(OBJEXT) ss_local-aead.$(OBJEXT) \
        ss_local-stream.$(OBJEXT) ss_local-ppbloom.$(OBJEXT) \
        ss_local-base64.$(OBJEXT)
-am__objects_6 = ss_local-plugin.$(OBJEXT)
-am__objects_7 = ss_local-http.$(OBJEXT) ss_local-tls.$(OBJEXT) \
-       ss_local-rule.$(OBJEXT)
+am__objects_7 = ss_local-plugin.$(OBJEXT)
+am__objects_8 = ss_local-http.$(OBJEXT) ss_local-tls.$(OBJEXT)
+am__objects_9 = ss_local-rule.$(OBJEXT) ss_local-acl.$(OBJEXT)
 am_ss_local_OBJECTS = ss_local-utils.$(OBJEXT) \
        ss_local-jconf.$(OBJEXT) ss_local-json.$(OBJEXT) \
        ss_local-udprelay.$(OBJEXT) ss_local-cache.$(OBJEXT) \
-       ss_local-acl.$(OBJEXT) ss_local-netutils.$(OBJEXT) \
-       ss_local-local.$(OBJEXT) $(am__objects_5) $(am__objects_6) \
-       $(am__objects_7)
+       ss_local-netutils.$(OBJEXT) ss_local-local.$(OBJEXT) \
+       $(am__objects_6) $(am__objects_7) $(am__objects_8) \
+       $(am__objects_9)
 ss_local_OBJECTS = $(am_ss_local_OBJECTS)
 ss_local_DEPENDENCIES = $(am__DEPENDENCIES_2)
 ss_local_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -212,13 +213,11 @@
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am__ss_redir_SOURCES_DIST = utils.c jconf.c json.c netutils.c cache.c \
        udprelay.c redir.c crypto.c aead.c stream.c ppbloom.c base64.c \
-       plugin.c http.c tls.c rule.c
-am__objects_8 = ss_redir-crypto.$(OBJEXT) ss_redir-aead.$(OBJEXT) \
+       plugin.c
+am__objects_10 = ss_redir-crypto.$(OBJEXT) ss_redir-aead.$(OBJEXT) \
        ss_redir-stream.$(OBJEXT) ss_redir-ppbloom.$(OBJEXT) \
        ss_redir-base64.$(OBJEXT)
-am__objects_9 = ss_redir-plugin.$(OBJEXT)
-am__objects_10 = ss_redir-http.$(OBJEXT) ss_redir-tls.$(OBJEXT) \
-       ss_redir-rule.$(OBJEXT)
+am__objects_11 = ss_redir-plugin.$(OBJEXT)
 @BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = ss_redir-utils.$(OBJEXT) \
 @BUILD_REDIRECTOR_TRUE@        ss_redir-jconf.$(OBJEXT) \
 @BUILD_REDIRECTOR_TRUE@        ss_redir-json.$(OBJEXT) \
@@ -226,39 +225,38 @@
 @BUILD_REDIRECTOR_TRUE@        ss_redir-cache.$(OBJEXT) \
 @BUILD_REDIRECTOR_TRUE@        ss_redir-udprelay.$(OBJEXT) \
 @BUILD_REDIRECTOR_TRUE@        ss_redir-redir.$(OBJEXT) \
-@BUILD_REDIRECTOR_TRUE@        $(am__objects_8) $(am__objects_9) \
-@BUILD_REDIRECTOR_TRUE@        $(am__objects_10)
+@BUILD_REDIRECTOR_TRUE@        $(am__objects_10) $(am__objects_11)
 ss_redir_OBJECTS = $(am_ss_redir_OBJECTS)
 @BUILD_REDIRECTOR_TRUE@ss_redir_DEPENDENCIES = $(am__DEPENDENCIES_2)
 ss_redir_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_redir_CFLAGS) \
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_11 = ss_server-crypto.$(OBJEXT) ss_server-aead.$(OBJEXT) \
+am__objects_12 = ss_server-crypto.$(OBJEXT) ss_server-aead.$(OBJEXT) \
        ss_server-stream.$(OBJEXT) ss_server-ppbloom.$(OBJEXT) \
        ss_server-base64.$(OBJEXT)
-am__objects_12 = ss_server-plugin.$(OBJEXT)
-am__objects_13 = ss_server-http.$(OBJEXT) ss_server-tls.$(OBJEXT) \
-       ss_server-rule.$(OBJEXT)
+am__objects_13 = ss_server-plugin.$(OBJEXT)
+am__objects_14 = ss_server-http.$(OBJEXT) ss_server-tls.$(OBJEXT)
+am__objects_15 = ss_server-rule.$(OBJEXT) ss_server-acl.$(OBJEXT)
 am_ss_server_OBJECTS = ss_server-utils.$(OBJEXT) \
        ss_server-netutils.$(OBJEXT) ss_server-jconf.$(OBJEXT) \
        ss_server-json.$(OBJEXT) ss_server-udprelay.$(OBJEXT) \
-       ss_server-cache.$(OBJEXT) ss_server-acl.$(OBJEXT) \
-       ss_server-resolv.$(OBJEXT) ss_server-server.$(OBJEXT) \
-       $(am__objects_11) $(am__objects_12) $(am__objects_13)
+       ss_server-cache.$(OBJEXT) ss_server-resolv.$(OBJEXT) \
+       ss_server-server.$(OBJEXT) $(am__objects_12) $(am__objects_13) \
+       $(am__objects_14) $(am__objects_15)
 ss_server_OBJECTS = $(am_ss_server_OBJECTS)
 ss_server_DEPENDENCIES = $(am__DEPENDENCIES_2)
 ss_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_server_CFLAGS) \
        $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_14 = ss_tunnel-crypto.$(OBJEXT) ss_tunnel-aead.$(OBJEXT) \
+am__objects_16 = ss_tunnel-crypto.$(OBJEXT) ss_tunnel-aead.$(OBJEXT) \
        ss_tunnel-stream.$(OBJEXT) ss_tunnel-ppbloom.$(OBJEXT) \
        ss_tunnel-base64.$(OBJEXT)
-am__objects_15 = ss_tunnel-plugin.$(OBJEXT)
+am__objects_17 = ss_tunnel-plugin.$(OBJEXT)
 am_ss_tunnel_OBJECTS = ss_tunnel-utils.$(OBJEXT) \
        ss_tunnel-jconf.$(OBJEXT) ss_tunnel-json.$(OBJEXT) \
        ss_tunnel-udprelay.$(OBJEXT) ss_tunnel-cache.$(OBJEXT) \
        ss_tunnel-netutils.$(OBJEXT) ss_tunnel-tunnel.$(OBJEXT) \
-       $(am__objects_14) $(am__objects_15)
+       $(am__objects_16) $(am__objects_17)
 ss_tunnel_OBJECTS = $(am_ss_tunnel_OBJECTS)
 ss_tunnel_DEPENDENCIES = $(am__DEPENDENCIES_2)
 ss_tunnel_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -469,8 +467,10 @@
 SS_COMMON_LIBS = $(INET_NTOP_LIB) $(LIBPCRE_LIBS) $(am__append_2) \
        $(am__append_3) -lev -lsodium -lm
 sni_src = http.c \
-          tls.c \
-          rule.c
+          tls.c
+
+acl_src = rule.c \
+          acl.c
 
 crypto_src = crypto.c \
              aead.c \
@@ -484,12 +484,12 @@
                    json.c \
                    udprelay.c \
                    cache.c \
-                   acl.c \
                    netutils.c \
                    local.c \
                    $(crypto_src) \
                    $(plugin_src) \
-                   $(sni_src)
+                   $(sni_src) \
+                   $(acl_src)
 
 ss_tunnel_SOURCES = utils.c \
                     jconf.c \
@@ -507,12 +507,12 @@
                     json.c \
                     udprelay.c \
                     cache.c \
-                    acl.c \
                     resolv.c \
                     server.c \
                     $(crypto_src) \
                     $(plugin_src) \
-                    $(sni_src)
+                    $(sni_src) \
+                    ${acl_src}
 
 ss_manager_SOURCES = utils.c \
                      jconf.c \
@@ -537,8 +537,7 @@
 @BUILD_REDIRECTOR_TRUE@                   udprelay.c \
 @BUILD_REDIRECTOR_TRUE@                   redir.c \
 @BUILD_REDIRECTOR_TRUE@                   $(crypto_src) \
-@BUILD_REDIRECTOR_TRUE@                   $(plugin_src) \
-@BUILD_REDIRECTOR_TRUE@                   $(sni_src)
+@BUILD_REDIRECTOR_TRUE@                   $(plugin_src)
 
 @BUILD_REDIRECTOR_TRUE@ss_redir_CFLAGS = $(AM_CFLAGS) -DMODULE_REDIR
 @BUILD_REDIRECTOR_TRUE@ss_redir_LDADD = $(SS_COMMON_LIBS) -lcares
@@ -778,16 +777,13 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-base64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-cache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-crypto.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-http.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-jconf.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-json.Po@am__quote@
 @AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/ss_redir-netutils.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-plugin.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-ppbloom.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-redir.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-rule.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-stream.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-tls.Po@am__quote@
 @AMDEP_TRUE@@am__include@ 
@am__quote@./$(DEPDIR)/ss_redir-udprelay.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-utils.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-acl.Po@am__quote@
@@ -881,13 +877,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o 
libshadowsocks_libev_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c
 
-libshadowsocks_libev_la-acl.lo: acl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-acl.lo 
-MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-acl.Tpo -c -o 
libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
$(DEPDIR)/libshadowsocks_libev_la-acl.Tpo 
$(DEPDIR)/libshadowsocks_libev_la-acl.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='libshadowsocks_libev_la-acl.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o 
libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
-
 libshadowsocks_libev_la-netutils.lo: netutils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT 
libshadowsocks_libev_la-netutils.lo -MD -MP -MF 
$(DEPDIR)/libshadowsocks_libev_la-netutils.Tpo -c -o 
libshadowsocks_libev_la-netutils.lo `test -f 'netutils.c' || echo 
'$(srcdir)/'`netutils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
$(DEPDIR)/libshadowsocks_libev_la-netutils.Tpo 
$(DEPDIR)/libshadowsocks_libev_la-netutils.Plo
@@ -965,6 +954,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o 
libshadowsocks_libev_la-rule.lo `test -f 'rule.c' || echo '$(srcdir)/'`rule.c
 
+libshadowsocks_libev_la-acl.lo: acl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-acl.lo 
-MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-acl.Tpo -c -o 
libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) 
$(DEPDIR)/libshadowsocks_libev_la-acl.Tpo 
$(DEPDIR)/libshadowsocks_libev_la-acl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='libshadowsocks_libev_la-acl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC 
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o 
libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
+
 ss_local-utils.o: utils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-utils.o 
-MD -MP -MF $(DEPDIR)/ss_local-utils.Tpo -c -o ss_local-utils.o `test -f 
'utils.c' || echo '$(srcdir)/'`utils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-utils.Tpo 
$(DEPDIR)/ss_local-utils.Po
@@ -1035,20 +1031,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else 
$(CYGPATH_W) '$(srcdir)/cache.c'; fi`
 
-ss_local-acl.o: acl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.o -MD 
-MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.o `test -f 'acl.c' || 
echo '$(srcdir)/'`acl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo 
$(DEPDIR)/ss_local-acl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_local-acl.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
-
-ss_local-acl.obj: acl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.obj 
-MD -MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.obj `if test -f 
'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo 
$(DEPDIR)/ss_local-acl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_local-acl.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else 
$(CYGPATH_W) '$(srcdir)/acl.c'; fi`
-
 ss_local-netutils.o: netutils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-netutils.o 
-MD -MP -MF $(DEPDIR)/ss_local-netutils.Tpo -c -o ss_local-netutils.o `test -f 
'netutils.c' || echo '$(srcdir)/'`netutils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-netutils.Tpo 
$(DEPDIR)/ss_local-netutils.Po
@@ -1203,6 +1185,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else 
$(CYGPATH_W) '$(srcdir)/rule.c'; fi`
 
+ss_local-acl.o: acl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.o -MD 
-MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.o `test -f 'acl.c' || 
echo '$(srcdir)/'`acl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo 
$(DEPDIR)/ss_local-acl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_local-acl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
+
+ss_local-acl.obj: acl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.obj 
-MD -MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.obj `if test -f 
'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo 
$(DEPDIR)/ss_local-acl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_local-acl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o 
ss_local-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else 
$(CYGPATH_W) '$(srcdir)/acl.c'; fi`
+
 ss_manager-utils.o: utils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_manager_CFLAGS) $(CFLAGS) -MT 
ss_manager-utils.o -MD -MP -MF $(DEPDIR)/ss_manager-utils.Tpo -c -o 
ss_manager-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_manager-utils.Tpo 
$(DEPDIR)/ss_manager-utils.Po
@@ -1455,48 +1451,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-plugin.obj `if test -f 'plugin.c'; then $(CYGPATH_W) 'plugin.c'; else 
$(CYGPATH_W) '$(srcdir)/plugin.c'; fi`
 
-ss_redir-http.o: http.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-http.o -MD 
-MP -MF $(DEPDIR)/ss_redir-http.Tpo -c -o ss_redir-http.o `test -f 'http.c' || 
echo '$(srcdir)/'`http.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-http.Tpo 
$(DEPDIR)/ss_redir-http.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='http.c' 
object='ss_redir-http.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c
-
-ss_redir-http.obj: http.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-http.obj 
-MD -MP -MF $(DEPDIR)/ss_redir-http.Tpo -c -o ss_redir-http.obj `if test -f 
'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-http.Tpo 
$(DEPDIR)/ss_redir-http.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='http.c' 
object='ss_redir-http.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else 
$(CYGPATH_W) '$(srcdir)/http.c'; fi`
-
-ss_redir-tls.o: tls.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-tls.o -MD 
-MP -MF $(DEPDIR)/ss_redir-tls.Tpo -c -o ss_redir-tls.o `test -f 'tls.c' || 
echo '$(srcdir)/'`tls.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-tls.Tpo 
$(DEPDIR)/ss_redir-tls.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tls.c' 
object='ss_redir-tls.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c
-
-ss_redir-tls.obj: tls.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-tls.obj 
-MD -MP -MF $(DEPDIR)/ss_redir-tls.Tpo -c -o ss_redir-tls.obj `if test -f 
'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-tls.Tpo 
$(DEPDIR)/ss_redir-tls.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='tls.c' 
object='ss_redir-tls.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else 
$(CYGPATH_W) '$(srcdir)/tls.c'; fi`
-
-ss_redir-rule.o: rule.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-rule.o -MD 
-MP -MF $(DEPDIR)/ss_redir-rule.Tpo -c -o ss_redir-rule.o `test -f 'rule.c' || 
echo '$(srcdir)/'`rule.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-rule.Tpo 
$(DEPDIR)/ss_redir-rule.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='rule.c' 
object='ss_redir-rule.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c
-
-ss_redir-rule.obj: rule.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-rule.obj 
-MD -MP -MF $(DEPDIR)/ss_redir-rule.Tpo -c -o ss_redir-rule.obj `if test -f 
'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-rule.Tpo 
$(DEPDIR)/ss_redir-rule.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='rule.c' 
object='ss_redir-rule.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o 
ss_redir-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else 
$(CYGPATH_W) '$(srcdir)/rule.c'; fi`
-
 ss_server-utils.o: utils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.o 
-MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.o `test -f 
'utils.c' || echo '$(srcdir)/'`utils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo 
$(DEPDIR)/ss_server-utils.Po
@@ -1581,20 +1535,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else 
$(CYGPATH_W) '$(srcdir)/cache.c'; fi`
 
-ss_server-acl.o: acl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.o 
-MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.o `test -f 'acl.c' 
|| echo '$(srcdir)/'`acl.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo 
$(DEPDIR)/ss_server-acl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_server-acl.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
-
-ss_server-acl.obj: acl.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.obj 
-MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.obj `if test -f 
'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo 
$(DEPDIR)/ss_server-acl.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_server-acl.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else 
$(CYGPATH_W) '$(srcdir)/acl.c'; fi`
-
 ss_server-resolv.o: resolv.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-resolv.o 
-MD -MP -MF $(DEPDIR)/ss_server-resolv.Tpo -c -o ss_server-resolv.o `test -f 
'resolv.c' || echo '$(srcdir)/'`resolv.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-resolv.Tpo 
$(DEPDIR)/ss_server-resolv.Po
@@ -1749,6 +1689,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else 
$(CYGPATH_W) '$(srcdir)/rule.c'; fi`
 
+ss_server-acl.o: acl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.o 
-MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.o `test -f 'acl.c' 
|| echo '$(srcdir)/'`acl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo 
$(DEPDIR)/ss_server-acl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_server-acl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c
+
+ss_server-acl.obj: acl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.obj 
-MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.obj `if test -f 
'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo 
$(DEPDIR)/ss_server-acl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='acl.c' 
object='ss_server-acl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) 
$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o 
ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else 
$(CYGPATH_W) '$(srcdir)/acl.c'; fi`
+
 ss_tunnel-utils.o: utils.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) 
$(AM_CPPFLAGS) $(CPPFLAGS) $(ss_tunnel_CFLAGS) $(CFLAGS) -MT ss_tunnel-utils.o 
-MD -MP -MF $(DEPDIR)/ss_tunnel-utils.Tpo -c -o ss_tunnel-utils.o `test -f 
'utils.c' || echo '$(srcdir)/'`utils.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/ss_tunnel-utils.Tpo 
$(DEPDIR)/ss_tunnel-utils.Po
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/acl.c 
new/shadowsocks-libev-3.1.3/src/acl.c
--- old/shadowsocks-libev-3.1.2/src/acl.c       2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/acl.c       2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * acl.c - Manage the ACL (Access Control List)
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/acl.h 
new/shadowsocks-libev-3.1.3/src/acl.h
--- old/shadowsocks-libev-3.1.2/src/acl.h       2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/acl.h       2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * acl.h - Define the ACL interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/aead.c 
new/shadowsocks-libev-3.1.3/src/aead.c
--- old/shadowsocks-libev-3.1.2/src/aead.c      2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/aead.c      2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * aead.c - Manage AEAD ciphers
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/aead.h 
new/shadowsocks-libev-3.1.3/src/aead.h
--- old/shadowsocks-libev-3.1.2/src/aead.h      2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/aead.h      2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * aead.h - Define the AEAD interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/cache.c 
new/shadowsocks-libev-3.1.3/src/cache.c
--- old/shadowsocks-libev-3.1.2/src/cache.c     2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/cache.c     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * cache.c - Manage the connection cache for UDPRELAY
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/cache.h 
new/shadowsocks-libev-3.1.3/src/cache.h
--- old/shadowsocks-libev-3.1.2/src/cache.h     2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/cache.h     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * cache.h - Define the cache manager interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/common.h 
new/shadowsocks-libev-3.1.3/src/common.h
--- old/shadowsocks-libev-3.1.2/src/common.h    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/common.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * common.h - Provide global definitions
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  * shadowsocks-libev is free software; you can redistribute it and/or modify
@@ -53,10 +53,10 @@
 #define STAGE_ERROR     -1  /* Error detected                   */
 #define STAGE_INIT       0  /* Initial stage                    */
 #define STAGE_HANDSHAKE  1  /* Handshake with client            */
-#define STAGE_PARSE      2  /* Parse the header                 */
+#define STAGE_PARSE      2  /* Parse the SOCKS5 header          */
+#define STAGE_SNI        3  /* Parse HTTP/SNI header            */
 #define STAGE_RESOLVE    4  /* Resolve the hostname             */
-#define STAGE_WAIT       5  /* Wait for more data               */
-#define STAGE_STREAM     6  /* Stream between client and server */
+#define STAGE_STREAM     5  /* Stream between client and server */
 
 /* Vals for long options */
 enum {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/crypto.c 
new/shadowsocks-libev-3.1.3/src/crypto.c
--- old/shadowsocks-libev-3.1.2/src/crypto.c    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/crypto.c    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * crypto.c - Manage the global crypto
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/crypto.h 
new/shadowsocks-libev-3.1.3/src/crypto.h
--- old/shadowsocks-libev-3.1.2/src/crypto.h    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/crypto.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * crypto.h - Define the enryptor's interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/jconf.c 
new/shadowsocks-libev-3.1.3/src/jconf.c
--- old/shadowsocks-libev-3.1.2/src/jconf.c     2017-12-27 02:24:11.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/jconf.c     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * jconf.c - Parse the JSON format config file
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  * shadowsocks-libev is free software; you can redistribute it and/or modify
@@ -262,10 +262,6 @@
                 check_json_value_type(value, json_boolean,
                                       "invalid config file: option 
'reuse_port' must be a boolean");
                 conf.reuse_port = value->u.boolean;
-            } else if (strcmp(name, "disable_sni") == 0) {
-                check_json_value_type(value, json_boolean,
-                                      "invalid config file: option 
'disable_sni' must be a boolean");
-                conf.disable_sni = value->u.boolean;
             } else if (strcmp(name, "auth") == 0) {
                 FATAL("One time auth has been deprecated. Try AEAD ciphers 
instead.");
             } else if (strcmp(name, "nofile") == 0) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/jconf.h 
new/shadowsocks-libev-3.1.3/src/jconf.h
--- old/shadowsocks-libev-3.1.2/src/jconf.h     2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/jconf.h     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * jconf.h - Define the config data structure
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  * shadowsocks-libev is free software; you can redistribute it and/or modify
@@ -76,7 +76,6 @@
     char *plugin_opts;
     int fast_open;
     int reuse_port;
-    int disable_sni;
     int nofile;
     char *nameserver;
     int dscp_num;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/local.c 
new/shadowsocks-libev-3.1.3/src/local.c
--- old/shadowsocks-libev-3.1.2/src/local.c     2017-12-27 10:06:22.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/local.c     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * local.c - Setup a socks5 proxy through remote shadowsocks server
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
@@ -253,7 +253,6 @@
     server_t *server = cork_container_of(watcher, server_t,
                                          delayed_connect_watcher);
 
-    server->stage = STAGE_WAIT;
     server_recv_cb(EV_A_ & server->recv_ctx->io, revents);
 }
 
@@ -266,13 +265,15 @@
     buffer_t *buf;
     ssize_t r;
 
+    ev_timer_stop(EV_A_ & server->delayed_connect_watcher);
+
     if (remote == NULL) {
         buf = server->buf;
     } else {
         buf = remote->buf;
     }
 
-    if (server->stage != STAGE_WAIT) {
+    if (revents != EV_TIMER) {
         r = recv(server->fd, buf->data + buf->len, BUF_SIZE - buf->len, 0);
 
         if (r == 0) {
@@ -294,8 +295,6 @@
             }
         }
         buf->len += r;
-    } else {
-        server->stage = STAGE_STREAM;
     }
 
     while (1) {
@@ -307,8 +306,6 @@
                 return;
             }
 
-            ev_timer_stop(EV_A_ & server->delayed_connect_watcher);
-
             // insert shadowsocks header
             if (!remote->direct) {
 #ifdef __ANDROID__
@@ -498,7 +495,9 @@
 
             buf->len = 0;
             return;
-        } else if (server->stage == STAGE_HANDSHAKE || server->stage == 
STAGE_PARSE) {
+        } else if (server->stage == STAGE_HANDSHAKE ||
+                   server->stage == STAGE_PARSE ||
+                   server->stage == STAGE_SNI) {
             struct socks5_request *request = (struct socks5_request 
*)buf->data;
             size_t request_len             = sizeof(struct socks5_request);
             struct sockaddr_in sock_addr;
@@ -568,9 +567,9 @@
                     // Wait until client closes the connection
                     return;
                 }
-            }
 
-            server->stage = STAGE_PARSE;
+                server->stage = STAGE_PARSE;
+            }
 
             char host[257], ip[INET6_ADDRSTRLEN], port[16];
 
@@ -650,7 +649,9 @@
                 else if (dst_port == tls_protocol->default_port)
                     ret = tls_protocol->parse_packet(buf->data + 3 + abuf->len,
                                                      buf->len - 3 - abuf->len, 
&hostname);
-                if (ret == -1 && buf->len < BUF_SIZE) {
+                if (ret == -1 && buf->len < BUF_SIZE && server->stage != 
STAGE_SNI) {
+                    server->stage = STAGE_SNI;
+                    ev_timer_start(EV_A_ & server->delayed_connect_watcher);
                     return;
                 } else if (ret > 0) {
                     sni_detected = 1;
@@ -658,6 +659,7 @@
                         memcpy(host, hostname, ret);
                         host[ret] = '\0';
                     }
+                    ss_free(hostname);
                 }
             }
 
@@ -682,13 +684,16 @@
                 && !(vpn && strcmp(port, "53") == 0)
 #endif
                 ) {
-                int host_match = acl_match_host(host);
                 int bypass     = 0;
                 int resolved   = 0;
                 struct sockaddr_storage storage;
                 memset(&storage, 0, sizeof(struct sockaddr_storage));
                 int err;
 
+                int host_match = 0;
+                if (sni_detected || atyp == 3)
+                    host_match = acl_match_host(host);
+
                 if (host_match > 0)
                     bypass = 1;                 // bypass hostnames in black 
list
                 else if (host_match < 0)
@@ -758,22 +763,6 @@
             // Not bypass
             if (remote == NULL) {
                 remote = create_remote(server->listener, NULL);
-
-                if (sni_detected) {
-#ifndef __ANDROID__
-                    // Reconstruct address buffer
-                    abuf->len               = 0;
-                    abuf->data[abuf->len++] = 3;
-                    abuf->data[abuf->len++] = ret;
-                    memcpy(abuf->data + abuf->len, hostname, ret);
-                    abuf->len += ret;
-                    dst_port  = htons(dst_port);
-                    memcpy(abuf->data + abuf->len, &dst_port, 2);
-                    abuf->len += 2;
-#endif
-
-                    ss_free(hostname);
-                }
             }
 
             if (remote == NULL) {
@@ -800,7 +789,11 @@
             server->remote = remote;
             remote->server = server;
 
-            ev_timer_start(EV_A_ & server->delayed_connect_watcher);
+            if (buf->len > 0 || sni_detected) {
+                continue;
+            } else {
+                ev_timer_start(EV_A_ & server->delayed_connect_watcher);
+            }
 
             return;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/local.h 
new/shadowsocks-libev-3.1.3/src/local.h
--- old/shadowsocks-libev-3.1.2/src/local.h     2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/local.h     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * local.h - Define the client's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/manager.c 
new/shadowsocks-libev-3.1.3/src/manager.c
--- old/shadowsocks-libev-3.1.2/src/manager.c   2017-12-27 02:24:11.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/manager.c   2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * server.c - Provide shadowsocks service
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/manager.h 
new/shadowsocks-libev-3.1.3/src/manager.h
--- old/shadowsocks-libev-3.1.2/src/manager.h   2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/manager.h   2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * server.h - Define shadowsocks server's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/netutils.c 
new/shadowsocks-libev-3.1.3/src/netutils.c
--- old/shadowsocks-libev-3.1.2/src/netutils.c  2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/netutils.c  2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * netutils.c - Network utilities
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
@@ -207,9 +207,6 @@
         return -1;
     if (p1_in->sin_family > p2_in->sin_family)
         return 1;
-    if (verbose) {
-        LOGI("sockaddr_cmp: sin_family equal? %d", p1_in->sin_family == 
p2_in->sin_family);
-    }
     /* compare ip4 */
     if (p1_in->sin_family == AF_INET) {
         /* just order it, ntohs not required */
@@ -217,9 +214,6 @@
             return -1;
         if (p1_in->sin_port > p2_in->sin_port)
             return 1;
-        if (verbose) {
-            LOGI("sockaddr_cmp: sin_port equal? %d", p1_in->sin_port == 
p2_in->sin_port);
-        }
         return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
     } else if (p1_in6->sin6_family == AF_INET6) {
         /* just order it, ntohs not required */
@@ -227,9 +221,6 @@
             return -1;
         if (p1_in6->sin6_port > p2_in6->sin6_port)
             return 1;
-        if (verbose) {
-            LOGI("sockaddr_cmp: sin6_port equal? %d", p1_in6->sin6_port == 
p2_in6->sin6_port);
-        }
         return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
                       INET6_SIZE);
     } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/netutils.h 
new/shadowsocks-libev-3.1.3/src/netutils.h
--- old/shadowsocks-libev-3.1.2/src/netutils.h  2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/netutils.h  2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * netutils.h - Network utilities
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/plugin.c 
new/shadowsocks-libev-3.1.3/src/plugin.c
--- old/shadowsocks-libev-3.1.2/src/plugin.c    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/plugin.c    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * plugin.c - Manage plugins
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/plugin.h 
new/shadowsocks-libev-3.1.3/src/plugin.h
--- old/shadowsocks-libev-3.1.2/src/plugin.h    2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/plugin.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * acl.h - Define the ACL interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/ppbloom.c 
new/shadowsocks-libev-3.1.3/src/ppbloom.c
--- old/shadowsocks-libev-3.1.2/src/ppbloom.c   2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/ppbloom.c   2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * ppbloom.c - Ping-Pong Bloom Filter for nonce reuse detection
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/ppbloom.h 
new/shadowsocks-libev-3.1.3/src/ppbloom.h
--- old/shadowsocks-libev-3.1.2/src/ppbloom.h   2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/ppbloom.h   2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * ppbloom.h - Define the Ping-Pong Bloom Filter interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/redir.c 
new/shadowsocks-libev-3.1.3/src/redir.c
--- old/shadowsocks-libev-3.1.2/src/redir.c     2017-12-27 02:24:11.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/redir.c     2018-01-16 02:18:57.000000000 
+0100
@@ -2,7 +2,7 @@
  * redir.c - Provide a transparent TCP proxy through remote shadowsocks
  *           server
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
@@ -47,8 +47,6 @@
 #include "config.h"
 #endif
 
-#include "http.h"
-#include "tls.h"
 #include "plugin.h"
 #include "netutils.h"
 #include "utils.h"
@@ -88,7 +86,6 @@
 int verbose        = 0;
 int reuse_port     = 0;
 int keep_resolving = 1;
-int disable_sni    = 0;
 
 static crypto_t *crypto;
 
@@ -240,26 +237,6 @@
     }
 
     if (!remote->send_ctx->connected) {
-        if (!disable_sni) {
-            // SNI
-            int ret       = 0;
-            uint16_t port = 0;
-            if (AF_INET6 == server->destaddr.ss_family) { // IPv6
-                port = ntohs(((struct sockaddr_in6 
*)&(server->destaddr))->sin6_port);
-            } else {                             // IPv4
-                port = ntohs(((struct sockaddr_in 
*)&(server->destaddr))->sin_port);
-            }
-            if (port == http_protocol->default_port)
-                ret = http_protocol->parse_packet(remote->buf->data,
-                                                  remote->buf->len, 
&server->hostname);
-            else if (port == tls_protocol->default_port)
-                ret = tls_protocol->parse_packet(remote->buf->data,
-                                                 remote->buf->len, 
&server->hostname);
-            if (ret > 0) {
-                server->hostname_len = ret;
-            }
-        }
-
         ev_io_stop(EV_A_ & server_recv_ctx->io);
         ev_io_start(EV_A_ & remote->send_ctx->io);
         return;
@@ -478,21 +455,7 @@
             buffer_t *abuf = &ss_addr_to_send;
             balloc(abuf, BUF_SIZE);
 
-            if (server->hostname_len > 0
-                && validate_hostname(server->hostname, server->hostname_len)) 
{     // HTTP/SNI
-                uint16_t port;
-                if (AF_INET6 == server->destaddr.ss_family) { // IPv6
-                    port = (((struct sockaddr_in6 
*)&(server->destaddr))->sin6_port);
-                } else {                             // IPv4
-                    port = (((struct sockaddr_in 
*)&(server->destaddr))->sin_port);
-                }
-
-                abuf->data[abuf->len++] = 3;          // Type 3 is hostname
-                abuf->data[abuf->len++] = server->hostname_len;
-                memcpy(abuf->data + abuf->len, server->hostname, 
server->hostname_len);
-                abuf->len += server->hostname_len;
-                memcpy(abuf->data + abuf->len, &port, 2);
-            } else if (AF_INET6 == server->destaddr.ss_family) { // IPv6
+            if (AF_INET6 == server->destaddr.ss_family) { // IPv6
                 abuf->data[abuf->len++] = 4;          // Type 4 is IPv6 address
 
                 size_t in6_addr_len = sizeof(struct in6_addr);
@@ -693,9 +656,6 @@
     server->send_ctx->server    = server;
     server->send_ctx->connected = 0;
 
-    server->hostname     = NULL;
-    server->hostname_len = 0;
-
     server->e_ctx = ss_align(sizeof(cipher_ctx_t));
     server->d_ctx = ss_align(sizeof(cipher_ctx_t));
     crypto->ctx_init(crypto->cipher, server->e_ctx, 1);
@@ -713,9 +673,6 @@
 static void
 free_server(server_t *server)
 {
-    if (server->hostname != NULL) {
-        ss_free(server->hostname);
-    }
     if (server->remote != NULL) {
         server->remote->server = NULL;
     }
@@ -1088,9 +1045,6 @@
         if (reuse_port == 0) {
             reuse_port = conf->reuse_port;
         }
-        if (disable_sni == 0) {
-            disable_sni = conf->disable_sni;
-        }
         if (fast_open == 0) {
             fast_open = conf->fast_open;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/redir.h 
new/shadowsocks-libev-3.1.3/src/redir.h
--- old/shadowsocks-libev-3.1.2/src/redir.h     2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/redir.h     2018-01-16 02:18:57.000000000 
+0100
@@ -1,6 +1,6 @@
 /* * redir.h - Define the redirector's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
@@ -58,9 +58,6 @@
     struct server_ctx *send_ctx;
     struct remote *remote;
 
-    char *hostname;
-    size_t hostname_len;
-
     struct sockaddr_storage destaddr;
     ev_timer delayed_connect_watcher;
 } server_t;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/server.c 
new/shadowsocks-libev-3.1.3/src/server.c
--- old/shadowsocks-libev-3.1.2/src/server.c    2017-12-28 07:15:42.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/server.c    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * server.c - Provide shadowsocks service
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/server.h 
new/shadowsocks-libev-3.1.3/src/server.h
--- old/shadowsocks-libev-3.1.2/src/server.h    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/server.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * server.h - Define shadowsocks server's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/shadowsocks.h 
new/shadowsocks-libev-3.1.3/src/shadowsocks.h
--- old/shadowsocks-libev-3.1.2/src/shadowsocks.h       2017-12-27 
02:24:11.000000000 +0100
+++ new/shadowsocks-libev-3.1.3/src/shadowsocks.h       2018-01-16 
02:18:57.000000000 +0100
@@ -1,7 +1,7 @@
 /*
  * shadowsocks.h - Header files of library interfaces
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  * shadowsocks-libev is free software; you can redistribute it and/or modify
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/stream.c 
new/shadowsocks-libev-3.1.3/src/stream.c
--- old/shadowsocks-libev-3.1.2/src/stream.c    2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/stream.c    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * stream.c - Manage stream ciphers
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/stream.h 
new/shadowsocks-libev-3.1.3/src/stream.h
--- old/shadowsocks-libev-3.1.2/src/stream.h    2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/stream.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * encrypt.h - Define the enryptor's interface
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/tunnel.c 
new/shadowsocks-libev-3.1.3/src/tunnel.c
--- old/shadowsocks-libev-3.1.2/src/tunnel.c    2017-12-27 02:24:11.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/tunnel.c    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * tunnel.c - Setup a local port forwarding through remote shadowsocks server
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/tunnel.h 
new/shadowsocks-libev-3.1.3/src/tunnel.h
--- old/shadowsocks-libev-3.1.2/src/tunnel.h    2017-06-27 08:33:10.000000000 
+0200
+++ new/shadowsocks-libev-3.1.3/src/tunnel.h    2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * tunnel.h - Define tunnel's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/udprelay.c 
new/shadowsocks-libev-3.1.3/src/udprelay.c
--- old/shadowsocks-libev-3.1.2/src/udprelay.c  2017-12-28 07:18:22.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/udprelay.c  2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * udprelay.c - Setup UDP relay for both client and server
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
@@ -192,7 +192,7 @@
     return key;
 }
 
-#if defined(MODULE_REDIR)
+#if defined(MODULE_REDIR) || defined(MODULE_REMOTE)
 static int
 construct_udprelay_header(const struct sockaddr_storage *in_addr,
                           char *addr_header)
@@ -727,13 +727,11 @@
 #endif
 
     if (len == 0) {
-        LOGI("[udp] error in parse header");
-        // error in parse header
+        // error when parsing header
+        LOGE("[udp] error in parse header");
         goto CLEAN_UP;
     }
 
-    // server may return using a different address type other than the type we
-    // have used during sending
 #if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)
     // Construct packet
     buf->len -= len;
@@ -756,8 +754,9 @@
 
     rx += buf->len;
 
-    char *addr_header   = remote_ctx->addr_header;
-    int addr_header_len = remote_ctx->addr_header_len;
+    // Reconstruct UDP response header
+    char addr_header[512];
+    int addr_header_len = construct_udprelay_header(&src_addr, addr_header);
 
     // Construct packet
     brealloc(buf, buf->len + addr_header_len, buf_size);
@@ -1159,8 +1158,6 @@
         remote_ctx                  = new_remote(remotefd, server_ctx);
         remote_ctx->src_addr        = src_addr;
         remote_ctx->af              = remote_addr->sa_family;
-        remote_ctx->addr_header_len = addr_header_len;
-        memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
 
         // Add to conn cache
         cache_insert(conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);
@@ -1170,6 +1167,9 @@
         ev_timer_start(EV_A_ & remote_ctx->watcher);
     }
 
+    remote_ctx->addr_header_len = addr_header_len;
+    memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
+
     if (offset > 0) {
         buf->len -= offset;
         memmove(buf->data, buf->data + offset, buf->len);
@@ -1207,16 +1207,8 @@
 
     if (remote_ctx != NULL) {
         cache_hit = 1;
-        // detect destination mismatch
-        if (remote_ctx->addr_header_len != addr_header_len
-            || memcmp(addr_header, remote_ctx->addr_header, addr_header_len) 
!= 0) {
-            remote_ctx->addr_header_len = addr_header_len;
-            memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
-            if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != 
AF_INET6) {
-                need_query = 1;
-            }
-        } else {
-            memcpy(&dst_addr, &remote_ctx->dst_addr, sizeof(struct 
sockaddr_storage));
+        if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {
+            need_query = 1;
         }
     } else {
         if (dst_addr.ss_family == AF_INET || dst_addr.ss_family == AF_INET6) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/udprelay.h 
new/shadowsocks-libev-3.1.3/src/udprelay.h
--- old/shadowsocks-libev-3.1.2/src/udprelay.h  2017-12-28 07:18:32.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/udprelay.h  2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * udprelay.h - Define UDP relay's buffers and callbacks
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/utils.c 
new/shadowsocks-libev-3.1.3/src/utils.c
--- old/shadowsocks-libev-3.1.2/src/utils.c     2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/utils.c     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * utils.c - Misc utilities
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/shadowsocks-libev-3.1.2/src/utils.h 
new/shadowsocks-libev-3.1.3/src/utils.h
--- old/shadowsocks-libev-3.1.2/src/utils.h     2017-12-01 02:52:04.000000000 
+0100
+++ new/shadowsocks-libev-3.1.3/src/utils.h     2018-01-16 02:18:57.000000000 
+0100
@@ -1,7 +1,7 @@
 /*
  * utils.h - Misc utilities
  *
- * Copyright (C) 2013 - 2017, Max Lv <[email protected]>
+ * Copyright (C) 2013 - 2018, Max Lv <[email protected]>
  *
  * This file is part of the shadowsocks-libev.
  *


Reply via email to