From d422b954be178afca1abeded9054ee6e39272904 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Mon, 9 Oct 2017 13:37:42 +0200 Subject: [PATCH] Fix pointer/int cast warnings on 64-bit Windows On 64-bit Windows, `long` is 32 bits wide and can't hold a pointer. Switch to ptrdiff_t instead which should be the same size as a pointer on every somewhat sane platform without requiring C99 types like intptr_t. Fixes bug 788312. Thanks to J. Peter Mugaas for the report and initial patch. --- SAX2.c | 3 ++- parser.c | 17 +++++++++-------- relaxng.c | 13 +++++++------ tree.c | 3 ++- xmlIO.c | 11 ++++++----- xmlmemory.c | 2 +- xpath.c | 55 +++++++++++++++++++++++++++-------------------------- 7 files changed, 55 insertions(+), 49 deletions(-) diff --git a/SAX2.c b/SAX2.c index 1508c776..0f261b7b 100644 --- a/SAX2.c +++ b/SAX2.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -1914,7 +1915,7 @@ skip: else { ret->line = 65535; if (ctxt->options & XML_PARSE_BIG_LINES) - ret->psvi = (void *) (long) ctxt->input->line; + ret->psvi = (void *) (ptrdiff_t) ctxt->input->line; } } } diff --git a/parser.c b/parser.c index 28d0cd2d..a816db0d 100644 --- a/parser.c +++ b/parser.c @@ -1335,7 +1335,7 @@ xmlAddSpecialAttr(xmlParserCtxtPtr ctxt, return; xmlHashAddEntry2(ctxt->attsSpecial, fullname, fullattr, - (void *) (long) type); + (void *) (ptrdiff_t) type); return; mem_error: @@ -1354,7 +1354,7 @@ xmlCleanSpecialAttrCallback(void *payload, void *data, const xmlChar *unused ATTRIBUTE_UNUSED) { xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) data; - if (((long) payload) == XML_ATTRIBUTE_CDATA) { + if (((ptrdiff_t) payload) == XML_ATTRIBUTE_CDATA) { xmlHashRemoveEntry2(ctxt->attsSpecial, fullname, fullattr, NULL); } } @@ -1866,7 +1866,7 @@ nameNsPush(xmlParserCtxtPtr ctxt, const xmlChar * value, ctxt->name = value; ctxt->pushTab[ctxt->nameNr * 3] = (void *) prefix; ctxt->pushTab[ctxt->nameNr * 3 + 1] = (void *) URI; - ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (long) nsNr; + ctxt->pushTab[ctxt->nameNr * 3 + 2] = (void *) (ptrdiff_t) nsNr; return (ctxt->nameNr++); mem_error: xmlErrMemory(ctxt, NULL); @@ -9070,8 +9070,8 @@ xmlParseAttribute2(xmlParserCtxtPtr ctxt, if (ctxt->attsSpecial != NULL) { int type; - type = (int) (long) xmlHashQLookup2(ctxt->attsSpecial, - pref, elem, *prefix, name); + type = (int) (ptrdiff_t) xmlHashQLookup2(ctxt->attsSpecial, + pref, elem, *prefix, name); if (type != 0) normalize = 1; } @@ -11532,9 +11532,10 @@ xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) { } if (ctxt->sax2) { xmlParseEndTag2(ctxt, - (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3], - (void *) ctxt->pushTab[ctxt->nameNr * 3 - 2], 0, - (int) (long) ctxt->pushTab[ctxt->nameNr * 3 - 1], 0); + (void *) ctxt->pushTab[ctxt->nameNr * 3 - 3], + (void *) ctxt->pushTab[ctxt->nameNr * 3 - 2], 0, + (int) (ptrdiff_t) + ctxt->pushTab[ctxt->nameNr * 3 - 1], 0); nameNsPop(ctxt); } #ifdef LIBXML_SAX1_ENABLED diff --git a/relaxng.c b/relaxng.c index 3d3e69c0..be731949 100644 --- a/relaxng.c +++ b/relaxng.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -4404,7 +4405,7 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, if ((*tmp)->type == XML_RELAXNG_TEXT) { res = xmlHashAddEntry2(partitions->triage, BAD_CAST "#text", NULL, - (void *) (long) (i + 1)); + (void *) (ptrdiff_t) (i + 1)); if (res != 0) is_determinist = -1; } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) && @@ -4412,22 +4413,22 @@ xmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def, if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) res = xmlHashAddEntry2(partitions->triage, (*tmp)->name, NULL, - (void *) (long) (i + 1)); + (void *) (ptrdiff_t) (i + 1)); else res = xmlHashAddEntry2(partitions->triage, (*tmp)->name, (*tmp)->ns, - (void *) (long) (i + 1)); + (void *) (ptrdiff_t) (i + 1)); if (res != 0) is_determinist = -1; } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) { if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0)) res = xmlHashAddEntry2(partitions->triage, BAD_CAST "#any", NULL, - (void *) (long) (i + 1)); + (void *) (ptrdiff_t) (i + 1)); else res = xmlHashAddEntry2(partitions->triage, BAD_CAST "#any", (*tmp)->ns, - (void *) (long) (i + 1)); + (void *) (ptrdiff_t) (i + 1)); if ((*tmp)->nameClass != NULL) is_determinist = 2; if (res != 0) @@ -9387,7 +9388,7 @@ xmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt, if (tmp == NULL) { i = nbgroups; } else { - i = ((long) tmp) - 1; + i = ((ptrdiff_t) tmp) - 1; if (partitions->flags & IS_NEEDCHECK) { group = partitions->groups[i]; if (!xmlRelaxNGNodeMatchesList(cur, group->defs)) diff --git a/tree.c b/tree.c index 25364425..911aa103 100644 --- a/tree.c +++ b/tree.c @@ -19,6 +19,7 @@ #include "libxml.h" #include /* for memset() only ! */ +#include #include #ifdef HAVE_CTYPE_H #include @@ -4605,7 +4606,7 @@ xmlGetLineNoInternal(const xmlNode *node, int depth) (node->type == XML_PI_NODE)) { if (node->line == 65535) { if ((node->type == XML_TEXT_NODE) && (node->psvi != NULL)) - result = (long) node->psvi; + result = (long) (ptrdiff_t) node->psvi; else if ((node->type == XML_ELEMENT_NODE) && (node->children != NULL)) result = xmlGetLineNoInternal(node->children, depth + 1); diff --git a/xmlIO.c b/xmlIO.c index 6891ff9a..5902f627 100644 --- a/xmlIO.c +++ b/xmlIO.c @@ -12,6 +12,7 @@ #include "libxml.h" #include +#include #ifdef HAVE_ERRNO_H #include #endif @@ -826,7 +827,7 @@ static int xmlFdRead (void * context, char * buffer, int len) { int ret; - ret = read((int) (long) context, &buffer[0], len); + ret = read((int) (ptrdiff_t) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "read()"); return(ret); } @@ -847,7 +848,7 @@ xmlFdWrite (void * context, const char * buffer, int len) { int ret = 0; if (len > 0) { - ret = write((int) (long) context, &buffer[0], len); + ret = write((int) (ptrdiff_t) context, &buffer[0], len); if (ret < 0) xmlIOErr(0, "write()"); } return(ret); @@ -865,7 +866,7 @@ xmlFdWrite (void * context, const char * buffer, int len) { static int xmlFdClose (void * context) { int ret; - ret = close((int) (long) context); + ret = close((int) (ptrdiff_t) context); if (ret < 0) xmlIOErr(0, "close()"); return(ret); } @@ -3008,7 +3009,7 @@ xmlParserInputBufferCreateFd(int fd, xmlCharEncoding enc) { ret = xmlAllocParserInputBuffer(enc); if (ret != NULL) { - ret->context = (void *) (long) fd; + ret->context = (void *) (ptrdiff_t) fd; ret->readcallback = xmlFdRead; ret->closecallback = xmlFdClose; } @@ -3114,7 +3115,7 @@ xmlOutputBufferCreateFd(int fd, xmlCharEncodingHandlerPtr encoder) { ret = xmlAllocOutputBufferInternal(encoder); if (ret != NULL) { - ret->context = (void *) (long) fd; + ret->context = (void *) (ptrdiff_t) fd; ret->writecallback = xmlFdWrite; ret->closecallback = NULL; } diff --git a/xmlmemory.c b/xmlmemory.c index 64003959..6f16c4b3 100644 --- a/xmlmemory.c +++ b/xmlmemory.c @@ -487,7 +487,7 @@ xmlMemFree(void *ptr) error: xmlGenericError(xmlGenericErrorContext, - "xmlMemFree(%lX) error\n", (unsigned long) ptr); + "xmlMemFree(%p) error\n", ptr); xmlMallocBreakpoint(); return; } diff --git a/xpath.c b/xpath.c index 55432c70..6fdb7df7 100644 --- a/xpath.c +++ b/xpath.c @@ -24,6 +24,7 @@ #include #include +#include #ifdef HAVE_SYS_TYPES_H #include @@ -159,7 +160,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { int misc = 0, precedence1 = 0, precedence2 = 0; xmlNodePtr miscNode1 = NULL, miscNode2 = NULL; xmlNodePtr cur, root; - long l1, l2; + ptrdiff_t l1, l2; if ((node1 == NULL) || (node2 == NULL)) return(-2); @@ -173,12 +174,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { switch (node1->type) { case XML_ELEMENT_NODE: if (node2->type == XML_ELEMENT_NODE) { - if ((0 > (long) node1->content) && /* TODO: Would a != 0 suffice here? */ - (0 > (long) node2->content) && + if ((0 > (ptrdiff_t) node1->content) && + (0 > (ptrdiff_t) node2->content) && (node1->doc == node2->doc)) { - l1 = -((long) node1->content); - l2 = -((long) node2->content); + l1 = -((ptrdiff_t) node1->content); + l2 = -((ptrdiff_t) node2->content); if (l1 < l2) return(1); if (l1 > l2) @@ -223,7 +224,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { node1 = node1->parent; } if ((node1 == NULL) || (node1->type != XML_ELEMENT_NODE) || - (0 <= (long) node1->content)) { + (0 <= (ptrdiff_t) node1->content)) { /* * Fallback for whatever case. */ @@ -273,7 +274,7 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { node2 = node2->parent; } if ((node2 == NULL) || (node2->type != XML_ELEMENT_NODE) || - (0 <= (long) node2->content)) + (0 <= (ptrdiff_t) node2->content)) { node2 = miscNode2; precedence2 = 0; @@ -346,12 +347,12 @@ xmlXPathCmpNodesExt(xmlNodePtr node1, xmlNodePtr node2) { */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && + (0 > (ptrdiff_t) node1->content) && + (0 > (ptrdiff_t) node2->content) && (node1->doc == node2->doc)) { - l1 = -((long) node1->content); - l2 = -((long) node2->content); + l1 = -((ptrdiff_t) node1->content); + l2 = -((ptrdiff_t) node2->content); if (l1 < l2) return(1); if (l1 > l2) @@ -414,12 +415,12 @@ turtle_comparison: */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && + (0 > (ptrdiff_t) node1->content) && + (0 > (ptrdiff_t) node2->content) && (node1->doc == node2->doc)) { - l1 = -((long) node1->content); - l2 = -((long) node2->content); + l1 = -((ptrdiff_t) node1->content); + l2 = -((ptrdiff_t) node2->content); if (l1 < l2) return(1); if (l1 > l2) @@ -3239,7 +3240,7 @@ xmlXPathFormatNumber(double number, char buffer[], int buffersize) */ long xmlXPathOrderDocElems(xmlDocPtr doc) { - long count = 0; + ptrdiff_t count = 0; xmlNodePtr cur; if (doc == NULL) @@ -3271,7 +3272,7 @@ xmlXPathOrderDocElems(xmlDocPtr doc) { } } while (cur != NULL); } - return(count); + return((long) count); } /** @@ -3339,13 +3340,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && + (0 > (ptrdiff_t) node1->content) && + (0 > (ptrdiff_t) node2->content) && (node1->doc == node2->doc)) { - long l1, l2; + ptrdiff_t l1, l2; - l1 = -((long) node1->content); - l2 = -((long) node2->content); + l1 = -((ptrdiff_t) node1->content); + l2 = -((ptrdiff_t) node2->content); if (l1 < l2) return(1); if (l1 > l2) @@ -3402,13 +3403,13 @@ xmlXPathCmpNodes(xmlNodePtr node1, xmlNodePtr node2) { */ if ((node1->type == XML_ELEMENT_NODE) && (node2->type == XML_ELEMENT_NODE) && - (0 > (long) node1->content) && - (0 > (long) node2->content) && + (0 > (ptrdiff_t) node1->content) && + (0 > (ptrdiff_t) node2->content) && (node1->doc == node2->doc)) { - long l1, l2; + ptrdiff_t l1, l2; - l1 = -((long) node1->content); - l2 = -((long) node2->content); + l1 = -((ptrdiff_t) node1->content); + l2 = -((ptrdiff_t) node2->content); if (l1 < l2) return(1); if (l1 > l2)