Skip to content

Commit

Permalink
Fix segmentation fault when set nil to Nginx::Headers_{in,out}. Fixed m…
Browse files Browse the repository at this point in the history
  • Loading branch information
yyamano committed Aug 18, 2020
1 parent 5859037 commit 8f37b5f
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions src/http/ngx_http_mruby_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,18 +227,28 @@ static ngx_int_t ngx_mrb_set_request_header(mrb_state *mrb, ngx_list_t *headers,
ngx_http_request_t *r = ngx_mrb_get_request();

key_len = (size_t)RSTRING_LEN(mrb_key);
val_len = (size_t)RSTRING_LEN(mrb_val);

key = ngx_pnalloc(pool, key_len);
if (key == NULL) {
return NGX_ERROR;
}
ngx_memcpy(key, (u_char *)RSTRING_PTR(mrb_key), key_len);

/* TODO:optimize later(linear-search is slow) */
if (update || mrb_nil_p(mrb_val)) {
while (!mrb_nil_p(ngx_mrb_get_request_header(mrb, headers, (char *)key, key_len))) {
ngx_mrb_del_request_header(mrb, headers, (char *)key, key_len);
}
}
if (mrb_nil_p(mrb_val)) {
/* If the value is nil, just remove the key from the headers. */
return NGX_OK;
}

val_len = (size_t)RSTRING_LEN(mrb_val);
val = ngx_pnalloc(pool, val_len);
if (val == NULL) {
return NGX_ERROR;
}

ngx_memcpy(key, (u_char *)RSTRING_PTR(mrb_key), key_len);
ngx_memcpy(val, (u_char *)RSTRING_PTR(mrb_val), val_len);

switch (ngx_mruby_builtin_header_lookup_token(key, key_len)) {
Expand All @@ -260,13 +270,6 @@ static ngx_int_t ngx_mrb_set_request_header(mrb_state *mrb, ngx_list_t *headers,
break;
}

/* TODO:optimize later(linear-search is slow) */
if (update) {
while (!mrb_nil_p(ngx_mrb_get_request_header(mrb, headers, (char *)key, key_len))) {
ngx_mrb_del_request_header(mrb, headers, (char *)key, key_len);
}
}

new_header = ngx_list_push(headers);
if (new_header == NULL) {
return NGX_ERROR;
Expand Down

0 comments on commit 8f37b5f

Please sign in to comment.