Skip to content

Commit 24007fa

Browse files
committed
Fix possible NULL pointer dereference casued by apreq_param_make()
The function apreq_param_make() will return NULL on failure. However NULL check are forgetten before derenference, which could lead to NULL pointer dereference. Adding NULL check to all use of apreq_param_make(). Submitted by: Zhou Qingyang <[email protected]> Github: closes apache#303 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1908981 13f79535-47bb-0310-9956-ffa450edef68
1 parent 51a3e29 commit 24007fa

5 files changed

+22
-0
lines changed

server/apreq_module_cgi.c

+8
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,8 @@ static apr_status_t cgi_args(apreq_handle_t *handle,
562562
if (val == NULL)
563563
val = "";
564564
p = apreq_param_make(handle->pool, name, strlen(name), val, strlen(val));
565+
if (p == NULL)
566+
return APR_ENOMEM;
565567
apreq_param_tainted_on(p);
566568
apreq_value_table_add(&p->v, req->args);
567569
val = p->v.data;
@@ -642,6 +644,8 @@ static apreq_param_t *cgi_args_get(apreq_handle_t *handle,
642644
if (val == NULL)
643645
return NULL;
644646
p = apreq_param_make(handle->pool, name, strlen(name), val, strlen(val));
647+
if (p == NULL)
648+
return NULL;
645649
apreq_param_tainted_on(p);
646650
apreq_value_table_add(&p->v, req->args);
647651
val = p->v.data;
@@ -678,6 +682,8 @@ static apr_status_t cgi_body(apreq_handle_t *handle,
678682
if (val == NULL)
679683
val = "";
680684
p = apreq_param_make(handle->pool, name, strlen(name), val, strlen(val));
685+
if (p == NULL)
686+
return APR_ENOMEM;
681687
apreq_param_tainted_on(p);
682688
apreq_value_table_add(&p->v, req->body);
683689
val = p->v.data;
@@ -720,6 +726,8 @@ static apreq_param_t *cgi_body_get(apreq_handle_t *handle,
720726
if (val == NULL)
721727
return NULL;
722728
p = apreq_param_make(handle->pool, name, strlen(name), val, strlen(val));
729+
if (p == NULL)
730+
return NULL;
723731
apreq_param_tainted_on(p);
724732
apreq_value_table_add(&p->v, req->body);
725733
val = p->v.data;

server/apreq_parser.c

+2
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ APREQ_DECLARE_PARSER(apreq_parse_generic)
228228
ctx->status = GEN_INCOMPLETE;
229229
ctx->param = apreq_param_make(pool,
230230
"_dummy_", strlen("_dummy_"), "", 0);
231+
if (ctx->param == NULL)
232+
return APR_ENOMEM;
231233
ctx->param->upload = apr_brigade_create(pool, parser->bucket_alloc);
232234
ctx->param->info = apr_table_make(pool, APREQ_DEFAULT_NELTS);
233235
}

server/apreq_parser_header.c

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ static apr_status_t consume_header_line(apreq_param_t **p,
8484
int i, eol = 0;
8585

8686
param = apreq_param_make(pool, NULL, nlen, NULL, vlen);
87+
if (param == NULL)
88+
return APR_ENOMEM;
8789
*(const apreq_value_t **)&v = &param->v;
8890

8991
arr.pool = pool;

server/apreq_parser_multipart.c

+8
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,8 @@ APREQ_DECLARE_PARSER(apreq_parse_multipart)
472472

473473
param = apreq_param_make(pool, name, nlen,
474474
filename, flen);
475+
if (param == NULL)
476+
return APR_ENOMEM;
475477
apreq_param_tainted_on(param);
476478
param->info = ctx->info;
477479
param->upload
@@ -505,6 +507,8 @@ APREQ_DECLARE_PARSER(apreq_parse_multipart)
505507
nlen = strlen(name);
506508
param = apreq_param_make(pool, name, nlen,
507509
filename, flen);
510+
if (param == NULL)
511+
return APR_ENOMEM;
508512
apreq_param_tainted_on(param);
509513
param->info = ctx->info;
510514
param->upload = apr_brigade_create(pool,
@@ -532,6 +536,8 @@ APREQ_DECLARE_PARSER(apreq_parse_multipart)
532536
flen = 0;
533537
param = apreq_param_make(pool, name, nlen,
534538
filename, flen);
539+
if (param == NULL)
540+
return APR_ENOMEM;
535541
apreq_param_tainted_on(param);
536542
param->info = ctx->info;
537543
param->upload = apr_brigade_create(pool,
@@ -569,6 +575,8 @@ APREQ_DECLARE_PARSER(apreq_parse_multipart)
569575
param = apreq_param_make(pool, ctx->param_name,
570576
strlen(ctx->param_name),
571577
NULL, len);
578+
if (param == NULL)
579+
return APR_ENOMEM;
572580
apreq_param_tainted_on(param);
573581
param->info = ctx->info;
574582

server/apreq_parser_urlencoded.c

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ static apr_status_t split_urlword(apreq_param_t **p, apr_pool_t *pool,
6464
return APR_EBADARG;
6565

6666
param = apreq_param_make(pool, NULL, nlen, NULL, vlen);
67+
if (param == NULL)
68+
return APR_ENOMEM;
6769
*(const apreq_value_t **)&v = &param->v;
6870

6971
arr.pool = pool;

0 commit comments

Comments
 (0)