mirror of
https://github.com/nginx/nginx.git
synced 2024-12-26 00:41:02 -06:00
Memcached: protect from too long responses.
If a memcached response was followed by a correct trailer, and then the NUL character followed by some extra data - this was accepted by the trailer checking code. This in turn resulted in ctx->rest underflow and caused negative size buffer on the next reading from the upstream, followed by the "negative size buf in writer" alert. Fix is to always check for too long responses, so a correct trailer cannot be followed by extra data.
This commit is contained in:
parent
829c9d5981
commit
b835b57184
@ -485,7 +485,8 @@ ngx_http_memcached_filter(void *data, ssize_t bytes)
|
|||||||
|
|
||||||
if (u->length == (ssize_t) ctx->rest) {
|
if (u->length == (ssize_t) ctx->rest) {
|
||||||
|
|
||||||
if (ngx_strncmp(b->last,
|
if (bytes > u->length
|
||||||
|
|| ngx_strncmp(b->last,
|
||||||
ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,
|
ngx_http_memcached_end + NGX_HTTP_MEMCACHED_END - ctx->rest,
|
||||||
bytes)
|
bytes)
|
||||||
!= 0)
|
!= 0)
|
||||||
@ -540,7 +541,9 @@ ngx_http_memcached_filter(void *data, ssize_t bytes)
|
|||||||
|
|
||||||
last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END);
|
last += (size_t) (u->length - NGX_HTTP_MEMCACHED_END);
|
||||||
|
|
||||||
if (ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0) {
|
if (bytes > u->length
|
||||||
|
|| ngx_strncmp(last, ngx_http_memcached_end, b->last - last) != 0)
|
||||||
|
{
|
||||||
ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, ctx->request->connection->log, 0,
|
||||||
"memcached sent invalid trailer");
|
"memcached sent invalid trailer");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user