Merge branch 'tor-gitlab/mr/239' into maint-0.3.5

This commit is contained in:
David Goulet 2021-01-28 12:42:26 -05:00
commit 290007e3c4
2 changed files with 10 additions and 1 deletions

4
changes/bug40190 Normal file
View File

@ -0,0 +1,4 @@
o Minor bugfixes (SOCKS5):
- Handle partial socks5 messages correctly. Previously, our code would
send an incorrect error message if it got a socks5 request that wasn't
complete. Fixes bug 40190; bugfix on 0.3.5.1-alpha.

View File

@ -545,6 +545,7 @@ parse_socks5_client_request(const uint8_t *raw_data, socks_request_t *req,
if (parsed == -1) { if (parsed == -1) {
log_warn(LD_APP, "socks5: parsing failed - invalid client request"); log_warn(LD_APP, "socks5: parsing failed - invalid client request");
res = SOCKS_RESULT_INVALID; res = SOCKS_RESULT_INVALID;
socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR);
goto end; goto end;
} else if (parsed == -2) { } else if (parsed == -2) {
res = SOCKS_RESULT_TRUNCATED; res = SOCKS_RESULT_TRUNCATED;
@ -556,6 +557,7 @@ parse_socks5_client_request(const uint8_t *raw_data, socks_request_t *req,
if (socks5_client_request_get_version(trunnel_req) != 5) { if (socks5_client_request_get_version(trunnel_req) != 5) {
res = SOCKS_RESULT_INVALID; res = SOCKS_RESULT_INVALID;
socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR);
goto end; goto end;
} }
@ -590,6 +592,7 @@ parse_socks5_client_request(const uint8_t *raw_data, socks_request_t *req,
tor_addr_to_str(req->address, &destaddr, sizeof(req->address), 1); tor_addr_to_str(req->address, &destaddr, sizeof(req->address), 1);
} break; } break;
default: { default: {
socks_request_set_socks5_error(req, SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED);
res = -1; res = -1;
} break; } break;
} }
@ -770,8 +773,10 @@ handle_socks_message(const uint8_t *raw_data, size_t datalen,
} else { } else {
res = parse_socks5_client_request(raw_data, req, res = parse_socks5_client_request(raw_data, req,
datalen, drain_out); datalen, drain_out);
if (res != SOCKS_RESULT_DONE) { if (BUG(res == SOCKS_RESULT_INVALID && req->replylen == 0)) {
socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR); socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR);
}
if (res != SOCKS_RESULT_DONE) {
goto end; goto end;
} }