nss_dns: More consistency in corrupt message handling in getnetby*
Commit Message
If a parse error is encountered, fail with NO_RECOVERY and
NSS_STATUS_UNAVAIL.
2019-03-08 Florian Weimer <fweimer@redhat.com>
* resolv/nss_dns/dns-network.c (getanswer_r): Handle unparseable
messages more consistently.
@@ -336,14 +336,11 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
bp[0] = '\0';
if (n < 0)
- break;
+ goto bad_message;
cp += n;
if (end_of_message - cp < 10)
- {
- __set_h_errno (NO_RECOVERY);
- return NSS_STATUS_UNAVAIL;
- }
+ goto bad_message;
int type, class;
GETSHORT (type, cp);
@@ -352,10 +349,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
uint16_t rdatalen;
GETSHORT (rdatalen, cp);
if (end_of_message - cp < rdatalen)
- {
- __set_h_errno (NO_RECOVERY);
- return NSS_STATUS_UNAVAIL;
- }
+ goto bad_message;
if (class == C_IN && type == T_PTR)
{
@@ -370,13 +364,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result,
}
if (n < 0)
- {
- /* XXX What does this mean? The original form from bind
- returns NULL. Incrementing cp has no effect in any case.
- What should I return here. ??? */
- cp += n;
- return NSS_STATUS_UNAVAIL;
- }
+ goto bad_message;
cp += rdatalen;
if (alias_pointer + 2 < &net_data->aliases[MAX_NR_ALIASES])
{