Fix ubsan applying zero offset to null pointer occurred in unit test

This commit is contained in:
Tatsuhiro Tsujikawa 2020-06-05 23:08:58 +09:00
parent 78a56cf66f
commit cf094bd56b
2 changed files with 30 additions and 4 deletions

View File

@ -899,9 +899,25 @@ nghttp2_settings_entry *nghttp2_frame_iv_copy(const nghttp2_settings_entry *iv,
} }
int nghttp2_nv_equal(const nghttp2_nv *a, const nghttp2_nv *b) { int nghttp2_nv_equal(const nghttp2_nv *a, const nghttp2_nv *b) {
return a->namelen == b->namelen && a->valuelen == b->valuelen && if (a->namelen != b->namelen || a->valuelen != b->valuelen) {
memcmp(a->name, b->name, a->namelen) == 0 && return 0;
memcmp(a->value, b->value, a->valuelen) == 0; }
if (a->name == NULL || b->name == NULL) {
assert(a->namelen == 0);
assert(b->namelen == 0);
} else if (memcmp(a->name, b->name, a->namelen) != 0) {
return 0;
}
if (a->value == NULL || b->value == NULL) {
assert(a->valuelen == 0);
assert(b->valuelen == 0);
} else if (memcmp(a->value, b->value, a->valuelen) != 0) {
return 0;
}
return 1;
} }
void nghttp2_nv_array_del(nghttp2_nv *nva, nghttp2_mem *mem) { void nghttp2_nv_array_del(nghttp2_nv *nva, nghttp2_mem *mem) {

View File

@ -5353,9 +5353,11 @@ static ssize_t inbound_frame_effective_readlen(nghttp2_inbound_frame *iframe,
return (ssize_t)(readlen); return (ssize_t)(readlen);
} }
static const uint8_t sin[] = {0};
ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in, ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
size_t inlen) { size_t inlen) {
const uint8_t *first = in, *last = in + inlen; const uint8_t *first, *last;
nghttp2_inbound_frame *iframe = &session->iframe; nghttp2_inbound_frame *iframe = &session->iframe;
size_t readlen; size_t readlen;
ssize_t padlen; ssize_t padlen;
@ -5366,6 +5368,14 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
size_t pri_fieldlen; size_t pri_fieldlen;
nghttp2_mem *mem; nghttp2_mem *mem;
if (in == NULL) {
assert(inlen == 0);
in = sin;
}
first = in;
last = in + inlen;
DEBUGF("recv: connection recv_window_size=%d, local_window=%d\n", DEBUGF("recv: connection recv_window_size=%d, local_window=%d\n",
session->recv_window_size, session->local_window_size); session->recv_window_size, session->local_window_size);