Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 5768:70a0408cca7b
Resolver: fixed resend on malformed responses.
DNS request resend on malformed responses was broken in 98876ce2a7fd (1.5.8).
Reported by Pramod Korathota.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Wed, 16 Jul 2014 10:21:28 +0400 |
parents | f166c521b619 |
children | 954867a2f0a6 |
comparison
equal
deleted
inserted
replaced
5767:abd460ece11e | 5768:70a0408cca7b |
---|---|
1465 "unexpected response for %V", &name); | 1465 "unexpected response for %V", &name); |
1466 ngx_resolver_free(r, name.data); | 1466 ngx_resolver_free(r, name.data); |
1467 goto failed; | 1467 goto failed; |
1468 } | 1468 } |
1469 | 1469 |
1470 rn->naddrs6 = 0; | |
1471 qident = (rn->query6[0] << 8) + rn->query6[1]; | 1470 qident = (rn->query6[0] << 8) + rn->query6[1]; |
1472 | 1471 |
1473 break; | 1472 break; |
1474 #endif | 1473 #endif |
1475 | 1474 |
1480 "unexpected response for %V", &name); | 1479 "unexpected response for %V", &name); |
1481 ngx_resolver_free(r, name.data); | 1480 ngx_resolver_free(r, name.data); |
1482 goto failed; | 1481 goto failed; |
1483 } | 1482 } |
1484 | 1483 |
1485 rn->naddrs = 0; | |
1486 qident = (rn->query[0] << 8) + rn->query[1]; | 1484 qident = (rn->query[0] << 8) + rn->query[1]; |
1487 } | 1485 } |
1488 | 1486 |
1489 if (ident != qident) { | 1487 if (ident != qident) { |
1490 ngx_log_error(r->log_level, r->log, 0, | 1488 ngx_log_error(r->log_level, r->log, 0, |
1505 #if (NGX_HAVE_INET6) | 1503 #if (NGX_HAVE_INET6) |
1506 switch (qtype) { | 1504 switch (qtype) { |
1507 | 1505 |
1508 case NGX_RESOLVE_AAAA: | 1506 case NGX_RESOLVE_AAAA: |
1509 | 1507 |
1508 rn->naddrs6 = 0; | |
1509 | |
1510 if (rn->naddrs == (u_short) -1) { | 1510 if (rn->naddrs == (u_short) -1) { |
1511 goto next; | 1511 goto next; |
1512 } | 1512 } |
1513 | 1513 |
1514 if (rn->naddrs) { | 1514 if (rn->naddrs) { |
1517 | 1517 |
1518 break; | 1518 break; |
1519 | 1519 |
1520 default: /* NGX_RESOLVE_A */ | 1520 default: /* NGX_RESOLVE_A */ |
1521 | 1521 |
1522 rn->naddrs = 0; | |
1523 | |
1522 if (rn->naddrs6 == (u_short) -1) { | 1524 if (rn->naddrs6 == (u_short) -1) { |
1523 goto next; | 1525 goto next; |
1524 } | 1526 } |
1525 | 1527 |
1526 if (rn->naddrs6) { | 1528 if (rn->naddrs6) { |
1536 | 1538 |
1537 #if (NGX_HAVE_INET6) | 1539 #if (NGX_HAVE_INET6) |
1538 switch (qtype) { | 1540 switch (qtype) { |
1539 | 1541 |
1540 case NGX_RESOLVE_AAAA: | 1542 case NGX_RESOLVE_AAAA: |
1543 | |
1544 rn->naddrs6 = 0; | |
1541 | 1545 |
1542 if (rn->naddrs == (u_short) -1) { | 1546 if (rn->naddrs == (u_short) -1) { |
1543 rn->code = (u_char) code; | 1547 rn->code = (u_char) code; |
1544 goto next; | 1548 goto next; |
1545 } | 1549 } |
1546 | 1550 |
1547 break; | 1551 break; |
1548 | 1552 |
1549 default: /* NGX_RESOLVE_A */ | 1553 default: /* NGX_RESOLVE_A */ |
1554 | |
1555 rn->naddrs = 0; | |
1550 | 1556 |
1551 if (rn->naddrs6 == (u_short) -1) { | 1557 if (rn->naddrs6 == (u_short) -1) { |
1552 rn->code = (u_char) code; | 1558 rn->code = (u_char) code; |
1553 goto next; | 1559 goto next; |
1554 } | 1560 } |
1812 } | 1818 } |
1813 } | 1819 } |
1814 #endif | 1820 #endif |
1815 | 1821 |
1816 i += len; | 1822 i += len; |
1823 } | |
1824 } | |
1825 | |
1826 switch (qtype) { | |
1827 | |
1828 #if (NGX_HAVE_INET6) | |
1829 case NGX_RESOLVE_AAAA: | |
1830 | |
1831 if (rn->naddrs6 == (u_short) -1) { | |
1832 rn->naddrs6 = 0; | |
1833 } | |
1834 | |
1835 break; | |
1836 #endif | |
1837 | |
1838 default: /* NGX_RESOLVE_A */ | |
1839 | |
1840 if (rn->naddrs == (u_short) -1) { | |
1841 rn->naddrs = 0; | |
1817 } | 1842 } |
1818 } | 1843 } |
1819 | 1844 |
1820 if (rn->naddrs != (u_short) -1 | 1845 if (rn->naddrs != (u_short) -1 |
1821 #if (NGX_HAVE_INET6) | 1846 #if (NGX_HAVE_INET6) |