1diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
2index 3a8a0d79e966..4e767091683d 100644
3--- a/third_party/libxml/src/parser.c
4+++ b/third_party/libxml/src/parser.c
5@@ -2081,8 +2081,8 @@ static void xmlSHRINK (xmlParserCtxtPtr ctxt) {
6 	xmlGROW (ctxt);
7
8 static void xmlGROW (xmlParserCtxtPtr ctxt) {
9-    unsigned long curEnd = ctxt->input->end - ctxt->input->cur;
10-    unsigned long curBase = ctxt->input->cur - ctxt->input->base;
11+    ptrdiff_t curEnd = ctxt->input->end - ctxt->input->cur;
12+    ptrdiff_t curBase = ctxt->input->cur - ctxt->input->base;
13
14     if (((curEnd > (unsigned long) XML_MAX_LOOKUP_LIMIT) ||
15          (curBase > (unsigned long) XML_MAX_LOOKUP_LIMIT)) &&
16@@ -8857,6 +8857,18 @@ xmlParseQNameAndCompare(xmlParserCtxtPtr ctxt, xmlChar const *name,
17  *     caller if it was copied, this can be detected by val[*len] == 0.
18  */
19
20+#define GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end) \
21+    const xmlChar *oldbase = ctxt->input->base;\
22+    GROW;\
23+    if (ctxt->instate == XML_PARSER_EOF)\
24+        return(NULL);\
25+    if (oldbase != ctxt->input->base) {\
26+        ptrdiff_t delta = ctxt->input->base - oldbase;\
27+        start = start + delta;\
28+        in = in + delta;\
29+    }\
30+    end = ctxt->input->end;
31+
32 static xmlChar *
33 xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
34                          int normalize)
35@@ -8886,14 +8898,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
36     end = ctxt->input->end;
37     start = in;
38     if (in >= end) {
39-        const xmlChar *oldbase = ctxt->input->base;
40-	GROW;
41-	if (oldbase != ctxt->input->base) {
42-	    long delta = ctxt->input->base - oldbase;
43-	    start = start + delta;
44-	    in = in + delta;
45-	}
46-	end = ctxt->input->end;
47+        GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
48     }
49     if (normalize) {
50         /*
51@@ -8910,16 +8915,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
52 	    in++;
53 	    start = in;
54 	    if (in >= end) {
55-		const xmlChar *oldbase = ctxt->input->base;
56-		GROW;
57-                if (ctxt->instate == XML_PARSER_EOF)
58-                    return(NULL);
59-		if (oldbase != ctxt->input->base) {
60-		    long delta = ctxt->input->base - oldbase;
61-		    start = start + delta;
62-		    in = in + delta;
63-		}
64-		end = ctxt->input->end;
65+                GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
66                 if (((in - start) > XML_MAX_TEXT_LENGTH) &&
67                     ((ctxt->options & XML_PARSE_HUGE) == 0)) {
68                     xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
69@@ -8933,16 +8929,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
70 	    col++;
71 	    if ((*in++ == 0x20) && (*in == 0x20)) break;
72 	    if (in >= end) {
73-		const xmlChar *oldbase = ctxt->input->base;
74-		GROW;
75-                if (ctxt->instate == XML_PARSER_EOF)
76-                    return(NULL);
77-		if (oldbase != ctxt->input->base) {
78-		    long delta = ctxt->input->base - oldbase;
79-		    start = start + delta;
80-		    in = in + delta;
81-		}
82-		end = ctxt->input->end;
83+                GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
84                 if (((in - start) > XML_MAX_TEXT_LENGTH) &&
85                     ((ctxt->options & XML_PARSE_HUGE) == 0)) {
86                     xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
87@@ -8971,7 +8958,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
88                 if (ctxt->instate == XML_PARSER_EOF)
89                     return(NULL);
90 		if (oldbase != ctxt->input->base) {
91-		    long delta = ctxt->input->base - oldbase;
92+		    ptrdiff_t delta = ctxt->input->base - oldbase;
93 		    start = start + delta;
94 		    in = in + delta;
95 		    last = last + delta;
96@@ -8998,16 +8985,7 @@ xmlParseAttValueInternal(xmlParserCtxtPtr ctxt, int *len, int *alloc,
97 	    in++;
98 	    col++;
99 	    if (in >= end) {
100-		const xmlChar *oldbase = ctxt->input->base;
101-		GROW;
102-                if (ctxt->instate == XML_PARSER_EOF)
103-                    return(NULL);
104-		if (oldbase != ctxt->input->base) {
105-		    long delta = ctxt->input->base - oldbase;
106-		    start = start + delta;
107-		    in = in + delta;
108-		}
109-		end = ctxt->input->end;
110+                GROW_PARSE_ATT_VALUE_INTERNAL(ctxt, in, start, end)
111                 if (((in - start) > XML_MAX_TEXT_LENGTH) &&
112                     ((ctxt->options & XML_PARSE_HUGE) == 0)) {
113                     xmlFatalErrMsg(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
114