From 893f9099b34171030c36e6b1612207e77f5ff021 Mon Sep 17 00:00:00 2001 From: Esdeath Date: Wed, 6 Sep 2017 15:07:19 +0800 Subject: [PATCH 1/7] Fix memory leak (#921) * Fix memory leak * Fix memory leak(2) * refine --- shadowsocks/crypto/aead.py | 3 --- shadowsocks/crypto/openssl.py | 22 ++++++++++++++++++---- shadowsocks/crypto/sodium.py | 22 ++++++++++++++++++---- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/shadowsocks/crypto/aead.py b/shadowsocks/crypto/aead.py index 7c52843..c7240b3 100644 --- a/shadowsocks/crypto/aead.py +++ b/shadowsocks/crypto/aead.py @@ -155,9 +155,6 @@ class AeadCryptoBase(object): # n, n > 0, waiting data self._chunk = {'mlen': AEAD_MSG_LEN_UNKNOWN, 'data': b''} - self.encrypt_once = self.aead_encrypt - self.decrypt_once = self.aead_decrypt - # load libsodium for nonce increment if not sodium_loaded: crypto_path = dict(crypto_path) if crypto_path else dict() diff --git a/shadowsocks/crypto/openssl.py b/shadowsocks/crypto/openssl.py index f2948ae..f034bd1 100644 --- a/shadowsocks/crypto/openssl.py +++ b/shadowsocks/crypto/openssl.py @@ -107,8 +107,11 @@ class OpenSSLCryptoBase(object): if not self._ctx: raise Exception('can not create cipher context') - self.encrypt_once = self.update - self.decrypt_once = self.update + def encrypt_once(self, data): + return self.update(data) + + def decrypt_once(self, data): + return self.update(data) def update(self, data): """ @@ -136,6 +139,7 @@ class OpenSSLCryptoBase(object): if self._ctx: ctx_cleanup(self._ctx) libcrypto.EVP_CIPHER_CTX_free(self._ctx) + self._ctx = None class OpenSSLAeadCrypto(OpenSSLCryptoBase, AeadCryptoBase): @@ -267,6 +271,12 @@ class OpenSSLAeadCrypto(OpenSSLCryptoBase, AeadCryptoBase): self.cipher_ctx_init() return plaintext + def encrypt_once(self, data): + return self.aead_encrypt(data) + + def decrypt_once(self, data): + return self.aead_decrypt(data) + class OpenSSLStreamCrypto(OpenSSLCryptoBase): """ @@ -281,8 +291,12 @@ class OpenSSLStreamCrypto(OpenSSLCryptoBase): if not r: self.clean() raise Exception('can not initialize cipher context') - self.encrypt = self.update - self.decrypt = self.update + + def encrypt(self, data): + return self.update(data) + + def decrypt(self, data): + return self.update(data) ciphers = { diff --git a/shadowsocks/crypto/sodium.py b/shadowsocks/crypto/sodium.py index fce65c0..981321e 100644 --- a/shadowsocks/crypto/sodium.py +++ b/shadowsocks/crypto/sodium.py @@ -192,10 +192,18 @@ class SodiumCrypto(object): raise Exception('Unknown cipher') # byte counter, not block counter self.counter = 0 - self.encrypt = self.update - self.decrypt = self.update - self.encrypt_once = self.update - self.decrypt_once = self.update + + def encrypt(self, data): + return self.update(data) + + def decrypt(self, data): + return self.update(data) + + def encrypt_once(self, data): + return self.update(data) + + def decrypt_once(self, data): + return self.update(data) def update(self, data): global buf_size, buf @@ -300,6 +308,12 @@ class SodiumAeadCrypto(AeadCryptoBase): self.cipher_ctx_init() return buf.raw[:cipher_out_len.value] + def encrypt_once(self, data): + return self.aead_encrypt(data) + + def decrypt_once(self, data): + return self.aead_decrypt(data) + ciphers = { 'salsa20': (32, 8, SodiumCrypto), From 3c82f0234356ed3a410886e2c81e3be37e47ff0e Mon Sep 17 00:00:00 2001 From: Minwei Shen Date: Wed, 6 Sep 2017 00:12:37 -0700 Subject: [PATCH 2/7] Improve lru_cache. Update test for it (#897) --- shadowsocks/lru_cache.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/shadowsocks/lru_cache.py b/shadowsocks/lru_cache.py index ff4fc7d..55cb346 100644 --- a/shadowsocks/lru_cache.py +++ b/shadowsocks/lru_cache.py @@ -79,18 +79,15 @@ class LRUCache(collections.MutableMapping): least = self._last_visits[0] if now - least <= self.timeout: break - if self.close_callback is not None: - for key in self._time_to_keys[least]: - if key in self._store: - if now - self._keys_to_last_time[key] > self.timeout: - value = self._store[key] - if value not in self._closed_values: - self.close_callback(value) - self._closed_values.add(value) self._last_visits.popleft() for key in self._time_to_keys[least]: if key in self._store: if now - self._keys_to_last_time[key] > self.timeout: + if self.close_callback is not None: + value = self._store[key] + if value not in self._closed_values: + self.close_callback(value) + self._closed_values.add(value) del self._store[key] del self._keys_to_last_time[key] c += 1 @@ -140,6 +137,7 @@ def test(): c = LRUCache(timeout=0.1, close_callback=close_cb) c['s'] = 1 + c['t'] = 1 c['s'] time.sleep(0.1) c['s'] From 91e6237794e13d7ce734d0586d89924a68da2ada Mon Sep 17 00:00:00 2001 From: Anthony Wong Date: Wed, 6 Sep 2017 15:13:26 +0800 Subject: [PATCH 3/7] Update README.md (#734) Add installation and usage instructions for snap package. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 4631576..ade2523 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ CentOS: yum install python-setuptools && easy_install pip pip install git+https://github.com/shadowsocks/shadowsocks.git@master +Linux distributions with [snap](http://snapcraft.io/): + + snap install shadowsocks + Windows: See [Install Shadowsocks Server on Windows](https://github.com/shadowsocks/shadowsocks/wiki/Install-Shadowsocks-Server-on-Windows). @@ -51,6 +55,11 @@ To check the log: Check all the options via `-h`. You can also use a [Configuration] file instead. +If you installed the [snap](http://snapcraft.io/) package, you have to prefix the commands with `shadowsocks.`, +like this: + + shadowsocks.ssserver -p 443 -k password -m aes-256-cfb + ### Usage with Config File [Create configeration file and run](https://github.com/shadowsocks/shadowsocks/wiki/Configuration-via-Config-File) From 0b0379b8308e2b8510bdb6bcb6f9144a15836bce Mon Sep 17 00:00:00 2001 From: Anthony Wong Date: Wed, 6 Sep 2017 15:13:39 +0800 Subject: [PATCH 4/7] Add new file snapcraft.yaml for building snap package (#932) --- snapcraft.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 snapcraft.yaml diff --git a/snapcraft.yaml b/snapcraft.yaml new file mode 100644 index 0000000..6860270 --- /dev/null +++ b/snapcraft.yaml @@ -0,0 +1,23 @@ +name: shadowsocks +version: 2.9.1-1 +summary: A fast tunnel proxy that helps you bypass firewalls +description: A fast tunnel proxy that helps you bypass firewalls +confinement: strict +grade: stable + +apps: + sslocal: + command: bin/sslocal + plugs: [network, network-bind] + aliases: [sslocal] + + ssserver: + command: bin/ssserver + plugs: [network, network-bind] + aliases: [ssserver] + +parts: + shadowsocks: + plugin: python + python-version: python2 + source: https://github.com/shadowsocks/shadowsocks/archive/2.9.1.tar.gz From 0168be7c92940fc1b2f69436e5d2787fb8b77bb3 Mon Sep 17 00:00:00 2001 From: mengskysama Date: Wed, 6 Sep 2017 15:19:45 +0800 Subject: [PATCH 5/7] Update .travis.yml new path for nginx static file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index dda0661..f11e179 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ cache: before_install: - sudo apt-get update -qq - sudo apt-get install -qq build-essential dnsutils iproute nginx bc - - sudo dd if=/dev/urandom of=/usr/share/nginx/www/file bs=1M count=10 + - sudo dd if=/dev/urandom of=/usr/share/nginx/html/file bs=1M count=10 - sudo sh -c "echo '127.0.0.1 localhost' > /etc/hosts" - sudo service nginx restart - pip install pep8 pyflakes nose coverage PySocks From f7d7aee3a6f77801a93ff9d384fd1b4664bd7749 Mon Sep 17 00:00:00 2001 From: Andrew Lyu Date: Wed, 6 Sep 2017 15:21:13 +0800 Subject: [PATCH 6/7] Fix typo (#866) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ade2523..99b669e 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ like this: ### Usage with Config File -[Create configeration file and run](https://github.com/shadowsocks/shadowsocks/wiki/Configuration-via-Config-File) +[Create configuration file and run](https://github.com/shadowsocks/shadowsocks/wiki/Configuration-via-Config-File) To start: From 2ab8c6bf5de7e7a5a2011a78d977ca23cbc7b0b3 Mon Sep 17 00:00:00 2001 From: mengskysama Date: Wed, 6 Sep 2017 16:11:14 +0800 Subject: [PATCH 7/7] Update jenkins.sh rm CI coverage --- tests/jenkins.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/jenkins.sh b/tests/jenkins.sh index 3a071c8..85dd01a 100755 --- a/tests/jenkins.sh +++ b/tests/jenkins.sh @@ -102,11 +102,10 @@ fi run_test tests/test_udp_src.sh run_test tests/test_command.sh -coverage combine && coverage report --include=shadowsocks/* -rm -rf htmlcov -rm -rf tmp -coverage html --include=shadowsocks/* - -coverage report --include=shadowsocks/* | tail -n1 | rev | cut -d' ' -f 1 | rev > /tmp/shadowsocks-coverage +# coverage combine && coverage report --include=shadowsocks/* +# rm -rf htmlcov +# rm -rf tmp +# coverage html --include=shadowsocks/* +# coverage report --include=shadowsocks/* | tail -n1 | rev | cut -d' ' -f 1 | rev > /tmp/shadowsocks-coverage exit $result