Fix buffer overflow vulnerability in extract_addresses() CVE-2026-5172

Thanks to Hugo Martinez Ray for spotting this.

The value of rdlen for an RR can be a lie, allowing the
call to extract_name() at rfc1025.c:952 to advance the value of p1
past the calculated end of the record. The makes the calculation
of bytes remaining in the RR underflow to a huge number and results
in a massive heap OOB read and certain crash.
This commit is contained in:
Simon Kelley committed 2026-05-10 21:49:40 +01:00
1 parent 9f651f3398
commit 073082ddc0
1 file changed
+2 -1
+2 -1
View File
@@ -953,7 +953,8 @@ int extract_addresses(struct dns_header *header, size_t qlen, char *name, time_t
/* Name, extract it then re-encode. */
int len;
if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0))
/* rdlen may lie, and extract_name() advances p1 past where it says the record ends. */
if (!extract_name(header, qlen, &p1, name, EXTR_NAME_EXTRACT, 0) || (p1 > endrr))
{
blockdata_free(addr.rrblock.rrdata);
return 2;