1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
Upstream-Status: Backport
diff --git a/dlls/dnsapi/libresolv.c b/dlls/dnsapi/libresolv.c
index ac52147af01..633169e6d66 100644
--- a/dlls/dnsapi/libresolv.c
+++ b/dlls/dnsapi/libresolv.c
@@ -344,6 +344,33 @@ static unsigned int get_record_size( const ns_rr *rr )
return size;
}
+/* based on ns_name_skip from libresolv */
+static int skip_name( const unsigned char **ptr, const unsigned char *end )
+{
+ const unsigned char *cp = *ptr;
+ unsigned int len;
+
+ while (cp < end && (len = *cp++))
+ {
+ switch (len & NS_CMPRSFLGS)
+ {
+ case 0:
+ cp += len;
+ continue;
+ case NS_CMPRSFLGS:
+ cp++;
+ break;
+ default:
+ return -1;
+ }
+ break;
+ }
+
+ if (cp > end) return -1;
+ *ptr = cp;
+ return 0;
+}
+
static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD *dlen )
{
DNS_STATUS ret = ERROR_SUCCESS;
@@ -390,7 +417,7 @@ static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD
r->Data.MINFO.pNameMailbox = dname_from_msg( msg, pos );
if (!r->Data.MINFO.pNameMailbox) return ERROR_NOT_ENOUGH_MEMORY;
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (skip_name( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.MINFO.pNameErrorsMailbox = dname_from_msg( msg, pos );
@@ -451,7 +478,7 @@ static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD
r->Data.SIG.pNameSigner = dname_from_msg( msg, pos );
if (!r->Data.SIG.pNameSigner) return ERROR_NOT_ENOUGH_MEMORY;
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (skip_name( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
/* FIXME: byte order? */
@@ -476,7 +503,7 @@ static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD
r->Data.SOA.pNamePrimaryServer = dname_from_msg( msg, pos );
if (!r->Data.SOA.pNamePrimaryServer) return ERROR_NOT_ENOUGH_MEMORY;
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (skip_name( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.SOA.pNameAdministrator = dname_from_msg( msg, pos );
@@ -486,7 +513,7 @@ static DNS_STATUS copy_rdata( ns_msg msg, const ns_rr *rr, DNS_RECORDA *r, WORD
return ERROR_NOT_ENOUGH_MEMORY;
}
- if (ns_name_skip( &pos, ns_msg_end( msg ) ) < 0)
+ if (skip_name( &pos, ns_msg_end( msg ) ) < 0)
return DNS_ERROR_BAD_PACKET;
r->Data.SOA.dwSerialNo = ntohl( *(const DWORD *)pos ); pos += sizeof(DWORD);
|