Commit Graph
152 Commits
Author SHA1 Message Date
Max Lv 454bdc0a67 Accept combined server endpoints with strict IPv6 parsing 2026-09-13 07:15:28 +08:00
Max Lv ea951e6bd1 Redesign CLI flags, help, and argument validation 2026-09-12 21:17:38 +08:00
Max Lv f5d5bf0be1 Publish native Doxygen documentation with GitHub Pages 2026-09-12 14:46:42 +08:00
Max Lv 146818c182 Generate CLI manual sections from source option declarations 2026-09-12 10:51:25 +08:00
Max Lv bdc77408cb Rename to shadowsocks-c with libuv, async DNS and CI lint (#3051)
Rename the project to shadowsocks-c while retaining ss-* commands, the embedding ABI, and legacy library/package lookup compatibility.

Replace libev with bundled libuv for IOCP/kqueue event backends, expand asynchronous runtime DNS coverage, and add actionlint/Ruff with strict clang-tidy failure handling. Validate native platforms, static builds, packaging, interoperability, sanitizers, and canonical/legacy consumers.

All 22 hosted checks pass at reviewed head a8493250eb.
2026-09-11 14:18:37 +08:00
Max Lv 8cc58cea95 Accept an ss:// server URL on the ss-local command line
shadowsocks-rust takes a whole server definition as a URL; libev could
only be given the pieces separately, so importing a server meant taking a
URL apart by hand. ss-local now accepts --server-url and reads the
address, port, cipher, password and SIP003 plugin from it.

Both encodings are handled: the SIP002 form with the userinfo in
base64url, and the older form where the whole body is one base64 blob.
The userinfo is also accepted in the clear, because that is what
shadowsocks-rust's `ssurl` emits for the 2022 ciphers, whose base64
pre-shared keys it percent-encodes instead. IPv6 literals, a trailing
slash, the plugin query and the '#' tag are all covered.

Options given later on the command line still win, since they are applied
as getopt reaches them.

ssurl.c sits with the ss-local sources rather than the shared ones: it
depends on base64.c, which ss-manager does not link.

The tests include URLs copied verbatim from `ssurl --encode` output, so
the parser is pinned against what another implementation really produces
rather than only against my reading of the spec. Verified end to end by
pointing ss-local at a rust-generated URL and proxying through their
ssserver.
2026-08-19 20:15:38 +08:00
Max LvandClaude Fable 5 dd2704c857 Fix bugs found by clang-tidy triage; ratchet warning budget to zero (#3047)
Real bugs fixed:
- manager.c: kill_server/stop_server checked fscanf() != EOF, so malformed
  pid file content left pid uninitialized and passed it to kill(). Parse
  with fgets + ss_parse_int and require pid > 0.
- utils.c: get_default_conf() crashed on strlen(NULL) when HOME is unset
  (e.g. daemons started by init) and left a dangling static pointer after
  free(), a latent use-after-free on repeated calls. Use a static buffer
  and fall back to the system config when HOME is missing.
- local.c: in UDP_ONLY mode, start_ss_local_server() passed uninitialized
  listen_ctx.fd to the library callback. Initialize it to -1.

Improvements:
- Replace rand()/srand(time(NULL)) upstream-server selection in ss-local,
  ss-redir and ss-tunnel with libsodium randombytes_uniform(): unbiased,
  unpredictable, and no seeding required (cert-msc30/msc32).
- Mark FATAL() noreturn so both the compiler and analyzers understand
  control flow (removes a family of analyzer false positives).
- Drop two dead stores (manager.c restore_sigchld, udprelay.c src_addr_len).

All remaining findings were verified as false positives and carry NOLINT
comments with rationale (uthash macro internals, symmetric back-pointer
cleanup, analyzer-invisible postconditions). clang-tidy-18 on Linux now
reports zero warnings, so MAX_WARNINGS drops from 29 to 0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 13:02:58 +08:00
Max Lv 5559eec939 Harden security-sensitive input handling (#3045)
* harden security-sensitive input handling

* enable ctest failure checks in ci

* add valgrind leak smoke tests

* split tests into separate workflow
2026-07-15 11:10:24 +08:00
Maxim Galaganov d61d09aa0c Detect kernel support for MPTCP at runtime 2022-06-23 10:38:32 +08:00
Gilles Depeyrot 8bcffa54b5 fix check for return value of open when redirecting to null device 2021-07-16 09:34:57 +08:00
Aven 4bbbe212eb Add support of nftables firewall
The change is to support the 'fail2ban' feature. Instead of
blocking IPs by server itself, server just add malicious IPs
to specified sets of nftables. So admin can configure rules
to deal with those IPs.

Notes: cap_net_admin capability is required.

Example configuration:
 # nft add table ip fail2ban
 # nft add chain ip fail2ban input { type filter hook input priority 0 \; }
 # nft add set ip fail2ban badips { type ipv4_addr \; flags dynamic, timeout \; timeout 1h \; }
 # nft add rule ip fail2ban input ip saddr @badips drop
 # ss-server -c config.json --nftables-sets badips
2021-07-01 12:05:39 +08:00
Not Sure 36d9993bbf Add --tcp-incoming-rcvbuf and --tcp-outgoing-rcvbuf which allow precise control over TCP receive buffers. 2020-12-23 07:13:14 +08:00
Not Sure 5617841694 Add --tcp-incoming-sndbuf and --tcp-outgoing-sndbuf which allow precise control over TCP send buffers.
- This is very useful in advanced scenarios such as ss-redir or chaining of servers using TPROXY
  to avoid bufferbloat-like performance degradation due to default large buffers of OS.
2020-12-23 07:13:14 +08:00
zfl9 78784507f1 add tcp_tproxy option, use tproxy instead of redirect (tcp) 2020-07-18 16:23:21 +08:00
ideal af722a4b92 Fix a tiny memory leak 2020-03-15 01:21:51 +08:00
Max Lv 03fb8c9f74 Revert "Add option '--long-idle' for server"
This reverts commit b4cda9dd42.
2019-09-02 09:25:30 +08:00
lixingcong b4cda9dd42 Add option '--long-idle' for server
Restore the default behavior handling timeout, make an option to enable
long idle connections.

Previously discussion:

https://github.com/shadowsocks/shadowsocks-libev/pull/2421

https://github.com/shadowsocks/shadowsocks-libev/issues/2427
2019-08-31 10:45:52 +08:00
Max Lv 64b97cd9a3 Clean up 2019-07-17 09:16:06 +08:00
Max Lv f0205e7f13 Refine the helper function 2019-06-30 22:32:54 +08:00
Chinsyo 7bd382042b bump copyright year 2019-03-21 12:39:29 +08:00
Max Lv 333e98dc86 Redirect standard fd to /dev/null by default 2019-01-28 21:59:30 +08:00
Max Lv 85b190372b Fix the ss_free macros 2019-01-22 16:20:49 +08:00
Max Lv 782311ad2b Refine ss_align interfaces 2019-01-22 12:59:29 +08:00
Max Lv fbb311ed06 Use _aligned_free for MinGW 2019-01-22 12:43:39 +08:00
Max Lv 4fb34de463 Use _aligned_malloc instead 2019-01-22 12:39:29 +08:00
Max Lv ba930dcca7 Fix a compiler warning 2019-01-22 09:17:53 +08:00
Max Lv d7fe31eae7 Refine ss_align for MinGW32 2019-01-21 17:51:37 +08:00
Simon Shi e5d8476afe Update docs 2019-01-04 23:28:52 +08:00
Max Lv 1c1570b28c Ensure 16-byte alignment. Fix #2233 2018-11-28 16:23:27 +08:00
Max Lv 569570cfa9 Fix #2215 2018-11-13 21:31:34 +08:00
Max Lv dd5e954ab4 Clean up 2018-09-02 17:21:23 -07:00
sxyoxygen 95c1dba176 Update utils.c 2018-08-08 01:47:19 +08:00
Roger Shimizu d88345fa46 Fix of PATH_MAX for GNU/Hurd
Memory of userconf in src/utils.c:get_default_conf() only gets allocated
once, and will not be freed. It's used as static buffer.

This can avoid using PATH_MAX, which actually doesn't exist on certain
platforms.

Info:
- https://www.gnu.org/software/hurd/community/gsoc/project_ideas/maxpath.html
- https://www.gnu.org/software/hurd/hurd/porting/guidelines.html#PATH_MAX_tt_MAX_PATH_tt_MAXPATHL
2018-06-16 19:47:39 +09:00
Yegor Ievlev 8fd83e2686 Use chacha20-ietf as a default cipher instead of rc4-md5 (#2080)
* Use chacha20-ietf as a default cipher instead of rc4-md5

* Update tunnel.c

* Update utils.c

* Update ss-local.asciidoc

* Update ss-local.asciidoc

* Update tunnel.c

* Update ss-tunnel.asciidoc

* Update ss-manager.asciidoc

* Update ss-redir.asciidoc

* Update shadowsocks-libev.asciidoc

* Update aead.c

* Update local.c

* Update server.c

* Update utils.c
2018-06-07 08:58:10 +08:00
Linus Yang 2ed8791dab Re-add support for MinGW 2018-03-08 17:26:11 +08:00
ksqsf eb501b70c7 Oops.. Remove useless code. 2018-02-11 00:53:33 +08:00
ksqsf 2a3d3bc13c Remove pointless optimization in get_default_conf() 2018-02-11 00:35:59 +08:00
ksqsf 3c3c50b4f8 Search XDG_CONFIG_HOME for user-specific config 2018-02-11 00:30:09 +08:00
Max Lv 85a64ae836 Bump version 2018-01-15 17:25:03 -08:00
星野ハジメ cc1bb4cf62 format with .uncrustify.cfg (#1759)
* format with .uncrustify.cfg

format with .uncrustify.cfg

* format with .uncrustify.cfg

* format with .uncrustify.cfg exclude json.* base64.* uthash.h

* format with .uncrustify.cfg exclude json.* base64.* uthash.h
2017-10-30 21:28:53 +08:00
Max Witten b721c0fa6d Update docs for TCP_NODELAY 2017-09-15 10:55:15 +08:00
Max Lv 0e74ea509c Refine the CLI help text. #1547 2017-07-06 17:17:17 +08:00
Max Lv 490b9cbcdc Fix #1430 2017-04-05 15:12:37 +08:00
Max Lv de0cebb62e Fix a building issue 2017-03-05 16:07:10 +08:00
Max Lv 5b122d4f8c Fix #1306 2017-02-27 13:37:07 +08:00
lqs 8a40e538f8 Add tcp-fast-open support for ss-redir 2017-02-26 22:45:31 +08:00
Max Lv d434cd20ec Fix a memory leak 2017-02-17 12:31:22 +08:00
Max Lv ef0402eb10 Add --key option to set key directly (#1207) 2017-02-06 17:02:04 +08:00
Max Lv 894eae567c Refine ciphers 2017-02-04 20:04:48 +08:00
Max Lv 6e0c257bce Fix help message 2017-02-03 07:24:18 +08:00