summaryrefslogtreecommitdiffstats
path: root/x11-libs/wine/patches/dnsapi.diff
blob: 9f748fd922289c2be312febc6663b9dfb293616b (plain) (blame)
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);