In resolv_validate_dns_response(), the second DNS record parsing path
manually constructs a 32-bit big-endian TTL value from four individual
bytes using the expression:
reader[0] *
16777216 + reader[1] * 65536 + reader[2] * 256 + reader[3]
We have read_n32() to do this, and it's more robust against unexpected
signedness surprises (which should not happen right here since reader is
unsigned char and we use -fwrapv so the result is defined). Also, let's
make the ttl an uint instead of an int. The TTL is only retrieved and not
used for now, so better clean it now.
char name[DNS_MAX_NAME_SIZE+1]; /* answer name */
int16_t type; /* question type */
int16_t class; /* query class */
- int32_t ttl; /* response TTL */
+ uint32_t ttl; /* response TTL */
int16_t priority; /* SRV type priority */
uint16_t weight; /* SRV type weight */
uint16_t port; /* SRV type port */
if (reader + 4 > bufend)
goto invalid_resp;
- answer_record->ttl = reader[0] * 16777216 + reader[1] * 65536
- + reader[2] * 256 + reader[3];
+ answer_record->ttl = read_n32(reader);
reader += 4;
/* Now reading data len */
if (reader + 4 > bufend)
goto invalid_resp;
- answer_record->ttl = reader[0] * 16777216 + reader[1] * 65536
- + reader[2] * 256 + reader[3];
+ answer_record->ttl = read_n32(reader);
reader += 4;
/* Now reading data len */