nghttp2_hd: Don't malloc if namelen/valuelen are zero

This commit is contained in:
Tatsuhiro Tsujikawa 2013-07-23 23:10:53 +09:00
parent 0000d3e7f9
commit 321136b042
2 changed files with 34 additions and 8 deletions

View File

@ -118,19 +118,28 @@ int nghttp2_hd_entry_init(nghttp2_hd_entry *ent, uint8_t index, uint8_t flags,
{ {
int rv = 0; int rv = 0;
if(flags & NGHTTP2_HD_FLAG_NAME_ALLOC) { if(flags & NGHTTP2_HD_FLAG_NAME_ALLOC) {
ent->nv.name = nghttp2_memdup(name, namelen); if(namelen == 0) {
if(ent->nv.name == NULL) { /* We should not allow empty header field name */
rv = NGHTTP2_ERR_NOMEM; ent->nv.name = NULL;
goto fail; } else {
ent->nv.name = nghttp2_memdup(name, namelen);
if(ent->nv.name == NULL) {
rv = NGHTTP2_ERR_NOMEM;
goto fail;
}
} }
} else { } else {
ent->nv.name = name; ent->nv.name = name;
} }
if(flags & NGHTTP2_HD_FLAG_VALUE_ALLOC) { if(flags & NGHTTP2_HD_FLAG_VALUE_ALLOC) {
ent->nv.value = nghttp2_memdup(value, valuelen); if(valuelen == 0) {
if(ent->nv.value == NULL) { ent->nv.value = NULL;
rv = NGHTTP2_ERR_NOMEM; } else {
goto fail2; ent->nv.value = nghttp2_memdup(value, valuelen);
if(ent->nv.value == NULL) {
rv = NGHTTP2_ERR_NOMEM;
goto fail2;
}
} }
} else { } else {
ent->nv.value = value; ent->nv.value = value;

View File

@ -57,6 +57,8 @@ void test_nghttp2_hd_deflate(void)
nghttp2_nv nva4[] = {MAKE_NV(":path", "/style.css"), nghttp2_nv nva4[] = {MAKE_NV(":path", "/style.css"),
MAKE_NV("cookie", "k1=v1"), MAKE_NV("cookie", "k1=v1"),
MAKE_NV("cookie", "k1=v1")}; MAKE_NV("cookie", "k1=v1")};
nghttp2_nv nva5[] = {MAKE_NV(":path", "/style.css"),
MAKE_NV("x-nghttp2", "")};
size_t nv_offset = 12; size_t nv_offset = 12;
uint8_t *buf = NULL; uint8_t *buf = NULL;
size_t buflen = 0; size_t buflen = 0;
@ -125,6 +127,21 @@ void test_nghttp2_hd_deflate(void)
nghttp2_nv_array_del(resnva); nghttp2_nv_array_del(resnva);
nghttp2_hd_end_headers(&inflater); nghttp2_hd_end_headers(&inflater);
/* Fifth headers includes empty value */
blocklen = nghttp2_hd_deflate_hd(&deflater, &buf, &buflen, nv_offset, nva5,
sizeof(nva5)/sizeof(nghttp2_nv));
CU_ASSERT(blocklen > 0);
nghttp2_hd_end_headers(&deflater);
CU_ASSERT(2 == nghttp2_hd_inflate_hd(&inflater, &resnva, buf + nv_offset,
blocklen));
assert_nv_equal(nva5, resnva, 2);
nghttp2_nv_array_del(resnva);
nghttp2_hd_end_headers(&inflater);
/* Cleanup */
free(buf); free(buf);
nghttp2_hd_inflate_free(&inflater); nghttp2_hd_inflate_free(&inflater);
nghttp2_hd_deflate_free(&deflater); nghttp2_hd_deflate_free(&deflater);