From deed2a60a08da461e90598e1a9035eb9bfc80fcf Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 30 Dec 2012 16:44:57 +0800 Subject: [PATCH] fix potential buffer overflow --- assets/shadowsocks | Bin 42312 -> 42312 bytes jni/shadowsocks/local.c | 27 +++++++++++++-------------- libs/armeabi/shadowsocks | Bin 42312 -> 42312 bytes 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/assets/shadowsocks b/assets/shadowsocks index 27063f38c0cb908b963e8fa36b4d243036a84566..d497239b059de0be547178f84648f82f199dfac7 100755 GIT binary patch delta 4587 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 #include #include +#include #include #include "local.h" @@ -23,14 +24,8 @@ #include "encrypt.h" #include "android.h" -#define REPLY "HTTP/1.1 200 OK\n\nhello" - #define min(a,b) (((a)<(b))?(a):(b)) -// every watcher type has its own typedef'd struct -// with the name ev_TYPE -ev_io stdin_watcher; - static char *_server; static char *_remote_port; @@ -147,12 +142,13 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { } } else if(w < r) { char *pt = remote->buf; - char *et = pt + min(w, BUF_SIZE); - while (pt < et) { + char *et = pt + r; + while (pt + w < et) { *pt = *(pt + w); pt++; } remote->buf_len = r - w; + assert(remote->buf_len >= 0); ev_io_stop(EV_A_ &server_recv_ctx->io); ev_io_start(EV_A_ &remote->send_ctx->io); break; @@ -270,12 +266,13 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) { if (r < server->buf_len) { // partly sent, move memory, wait for the next time to send char *pt = server->buf; - char *et = pt + min(r, BUF_SIZE); - while (pt < et) { + char *et = pt + server->buf_len; + while (pt + r < et) { *pt = *(pt + r); pt++; } server->buf_len -= r; + assert(server->buf_len >= 0); return; } else { // all sent out, wait for reading @@ -339,12 +336,13 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) { } } else if(w < r) { char *pt = server->buf; - char *et = pt + min(w, BUF_SIZE); - while (pt < et) { + char *et = pt + r; + while (pt + w < et) { *pt = *(pt + w); pt++; } server->buf_len = r - w; + assert(server->buf_len >= 0); ev_io_stop(EV_A_ &remote_recv_ctx->io); ev_io_start(EV_A_ &server->send_ctx->io); break; @@ -398,12 +396,13 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { if (r < remote->buf_len) { // partly sent, move memory, wait for the next time to send char *pt = remote->buf; - char *et = pt + min(r, BUF_SIZE); - while (pt < et) { + char *et = pt + remote->buf_len; + while (pt + r < et) { *pt = *(pt + r); pt++; } remote->buf_len -= r; + assert(remote->buf_len >= 0); return; } else { // all sent out, wait for reading diff --git a/libs/armeabi/shadowsocks b/libs/armeabi/shadowsocks index 27063f38c0cb908b963e8fa36b4d243036a84566..d497239b059de0be547178f84648f82f199dfac7 100755 GIT binary patch delta 4587 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