diff --git a/mongoose.c b/mongoose.c index c9ff611d..edea0fff 100644 --- a/mongoose.c +++ b/mongoose.c @@ -16223,16 +16223,14 @@ static int mg_der_to_tlv(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) { if (tlv->len > 0x7f) { // long-form length uint32_t i; n = tlv->len - 0x80; - if (n > 4 || dersz < (2 + n)) return -1; + if (n == 0 || n > 4 || dersz < (2 + n)) return -1; tlv->len = 0; for (i = 0; i < n; i++) { tlv->len = (tlv->len << 8) | der[2 + i]; } - if (n > (dersz - 2)) return -1; tlv->value += n; - } else { - if (der + dersz < tlv->value + tlv->len) return -1; } + if (tlv->len > dersz - (size_t) (tlv->value - der)) return -1; return (int) n; } diff --git a/src/tls_builtin.c b/src/tls_builtin.c index 9b70ae59..e14b4c64 100644 --- a/src/tls_builtin.c +++ b/src/tls_builtin.c @@ -194,16 +194,14 @@ static int mg_der_to_tlv(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) { if (tlv->len > 0x7f) { // long-form length uint32_t i; n = tlv->len - 0x80; - if (n > 4 || dersz < (2 + n)) return -1; + if (n == 0 || n > 4 || dersz < (2 + n)) return -1; tlv->len = 0; for (i = 0; i < n; i++) { tlv->len = (tlv->len << 8) | der[2 + i]; } - if (n > (dersz - 2)) return -1; tlv->value += n; - } else { - if (der + dersz < tlv->value + tlv->len) return -1; } + if (tlv->len > dersz - (size_t) (tlv->value - der)) return -1; return (int) n; }