[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[xml] Patch for Realloc Problems in uri.c



 

Hi,

  I am attaching a patch for some places where realloc is being done on the original pointer, in case of re-alloc failure this would lead to problems.

 

Regards

Ashwin

*** uri.c	2008-04-24 08:33:58.099843208 -0700
--- urifix.c	2008-04-24 08:33:59.546623264 -0700
*************** xmlCreateURI(void) {
*** 225,230 ****
--- 225,231 ----
  xmlChar *
  xmlSaveUri(xmlURIPtr uri) {
      xmlChar *ret = NULL;
+     xmlChar *temp;
      const char *p;
      int len;
      int max;
*************** xmlSaveUri(xmlURIPtr uri) {
*** 246,268 ****
  	while (*p != 0) {
  	    if (len >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
  		    return(NULL);
  		}
  	    }
  	    ret[len++] = *p++;
  	}
  	if (len >= max) {
  	    max *= 2;
! 	    ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 	    if (ret == NULL) {
  		xmlGenericError(xmlGenericErrorContext,
  			"xmlSaveUri: out of memory\n");
  		return(NULL);
  	    }
  	}
  	ret[len++] = ':';
      }
--- 247,273 ----
  	while (*p != 0) {
  	    if (len >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
+ 		    xmlFree(ret);
  		    return(NULL);
  		}
+ 		ret = temp;
  	    }
  	    ret[len++] = *p++;
  	}
  	if (len >= max) {
  	    max *= 2;
! 	    temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 	    if (temp == NULL) {
  		xmlGenericError(xmlGenericErrorContext,
  			"xmlSaveUri: out of memory\n");
+ 		xmlFree(ret);
  		return(NULL);
  	    }
+ 	    ret = temp;
  	}
  	ret[len++] = ':';
      }
*************** xmlSaveUri(xmlURIPtr uri) {
*** 271,282 ****
  	while (*p != 0) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
  		    return(NULL);
  		}
  	    }
  	    if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p)))
  		ret[len++] = *p++;
--- 276,289 ----
  	while (*p != 0) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
+ 		    xmlFree(ret);
  		    return(NULL);
  		}
+ 		ret = temp;
  	    }
  	    if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p)))
  		ret[len++] = *p++;
*************** xmlSaveUri(xmlURIPtr uri) {
*** 292,303 ****
  	if (uri->server != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
  		    return(NULL);
  		}
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
--- 299,312 ----
  	if (uri->server != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
  		    xmlGenericError(xmlGenericErrorContext,
  			    "xmlSaveUri: out of memory\n");
+                   xmlFree(ret);  
  		    return(NULL);
  		}
+ 		ret = temp;
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
*************** xmlSaveUri(xmlURIPtr uri) {
*** 306,318 ****
  		while (*p != 0) {
  		    if (len + 3 >= max) {
  			max *= 2;
! 			ret = (xmlChar *) xmlRealloc(ret,
  				(max + 1) * sizeof(xmlChar));
! 			if (ret == NULL) {
  			    xmlGenericError(xmlGenericErrorContext,
  				    "xmlSaveUri: out of memory\n");
  			    return(NULL);
  			}
  		    }
  		    if ((IS_UNRESERVED(*(p))) ||
  			((*(p) == ';')) || ((*(p) == ':')) ||
--- 315,329 ----
  		while (*p != 0) {
  		    if (len + 3 >= max) {
  			max *= 2;
! 			temp = (xmlChar *) xmlRealloc(ret,
  				(max + 1) * sizeof(xmlChar));
! 			if (temp == NULL) {
  			    xmlGenericError(xmlGenericErrorContext,
  				    "xmlSaveUri: out of memory\n");
+ 			    xmlFree(ret);
  			    return(NULL);
  			}
+ 			ret = temp;
  		    }
  		    if ((IS_UNRESERVED(*(p))) ||
  			((*(p) == ';')) || ((*(p) == ':')) ||
*************** xmlSaveUri(xmlURIPtr uri) {
*** 330,342 ****
  		}
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		ret[len++] = '@';
  	    }
--- 341,355 ----
  		}
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+ 			xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		ret[len++] = '@';
  	    }
*************** xmlSaveUri(xmlURIPtr uri) {
*** 344,382 ****
  	    while (*p != 0) {
  		if (len >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		ret[len++] = *p++;
  	    }
  	    if (uri->port > 0) {
  		if (len + 10 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
  	    }
  	} else if (uri->authority != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
! 		    xmlGenericError(xmlGenericErrorContext,
! 			    "xmlSaveUri: out of memory\n");
! 		    return(NULL);
! 		}
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
--- 357,401 ----
  	    while (*p != 0) {
  		if (len >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+ 			xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		ret[len++] = *p++;
  	    }
  	    if (uri->port > 0) {
  		if (len + 10 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+                      xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
  	    }
  	} else if (uri->authority != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
*************** xmlSaveUri(xmlURIPtr uri) {
*** 384,396 ****
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		if ((IS_UNRESERVED(*(p))) ||
                      ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) ||
--- 403,417 ----
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+                      xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		if ((IS_UNRESERVED(*(p))) ||
                      ((*(p) == '$')) || ((*(p) == ',')) || ((*(p) == ';')) ||
*************** xmlSaveUri(xmlURIPtr uri) {
*** 408,420 ****
  	} else if (uri->scheme != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
! 		    xmlGenericError(xmlGenericErrorContext,
! 			    "xmlSaveUri: out of memory\n");
! 		    return(NULL);
! 		}
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
--- 429,443 ----
  	} else if (uri->scheme != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
  	    }
  	    ret[len++] = '/';
  	    ret[len++] = '/';
*************** xmlSaveUri(xmlURIPtr uri) {
*** 448,460 ****
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) ||
                      ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) ||
--- 471,485 ----
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+                      xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		if ((IS_UNRESERVED(*(p))) || ((*(p) == '/')) ||
                      ((*(p) == ';')) || ((*(p) == '@')) || ((*(p) == '&')) ||
*************** xmlSaveUri(xmlURIPtr uri) {
*** 473,524 ****
  	if (uri->query_raw != NULL) {
  	    if (len + 1 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
! 		    xmlGenericError(xmlGenericErrorContext,
! 			    "xmlSaveUri: out of memory\n");
! 		    return(NULL);
! 		}
  	    }
  	    ret[len++] = '?';
  	    p = uri->query_raw;
  	    while (*p != 0) {
  		if (len + 1 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		ret[len++] = *p++;
  	    }
  	} else if (uri->query != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
! 		    xmlGenericError(xmlGenericErrorContext,
! 			    "xmlSaveUri: out of memory\n");
! 		    return(NULL);
! 		}
  	    }
  	    ret[len++] = '?';
  	    p = uri->query;
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    ret = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (ret == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
  			return(NULL);
  		    }
  		}
  		if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 
  		    ret[len++] = *p++;
--- 498,557 ----
  	if (uri->query_raw != NULL) {
  	    if (len + 1 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
  	    }
  	    ret[len++] = '?';
  	    p = uri->query_raw;
  	    while (*p != 0) {
  		if (len + 1 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+                      xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		ret[len++] = *p++;
  	    }
  	} else if (uri->query != NULL) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
  	    }
  	    ret[len++] = '?';
  	    p = uri->query;
  	    while (*p != 0) {
  		if (len + 3 >= max) {
  		    max *= 2;
! 		    temp = (xmlChar *) xmlRealloc(ret,
  			    (max + 1) * sizeof(xmlChar));
! 		    if (temp == NULL) {
  			xmlGenericError(xmlGenericErrorContext,
  				"xmlSaveUri: out of memory\n");
+                      xmlFree(ret);
  			return(NULL);
  		    }
+ 		    ret = temp;
  		}
  		if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 
  		    ret[len++] = *p++;
*************** xmlSaveUri(xmlURIPtr uri) {
*** 535,560 ****
      if (uri->fragment != NULL) {
  	if (len + 3 >= max) {
  	    max *= 2;
! 	    ret = (xmlChar *) xmlRealloc(ret,
  		    (max + 1) * sizeof(xmlChar));
! 	    if (ret == NULL) {
! 		xmlGenericError(xmlGenericErrorContext,
! 			"xmlSaveUri: out of memory\n");
! 		return(NULL);
! 	    }
  	}
  	ret[len++] = '#';
  	p = uri->fragment;
  	while (*p != 0) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		ret = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (ret == NULL) {
! 		    xmlGenericError(xmlGenericErrorContext,
! 			    "xmlSaveUri: out of memory\n");
! 		    return(NULL);
! 		}
  	    }
  	    if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 
  		ret[len++] = *p++;
--- 568,597 ----
      if (uri->fragment != NULL) {
  	if (len + 3 >= max) {
  	    max *= 2;
! 	    temp = (xmlChar *) xmlRealloc(ret,
  		    (max + 1) * sizeof(xmlChar));
! 	    if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
!         	    }
!         	    ret = temp;
  	}
  	ret[len++] = '#';
  	p = uri->fragment;
  	while (*p != 0) {
  	    if (len + 3 >= max) {
  		max *= 2;
! 		temp = (xmlChar *) xmlRealloc(ret,
  			(max + 1) * sizeof(xmlChar));
! 		if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
  	    }
  	    if ((IS_UNRESERVED(*(p))) || (IS_RESERVED(*(p)))) 
  		ret[len++] = *p++;
*************** xmlSaveUri(xmlURIPtr uri) {
*** 569,580 ****
      }
      if (len >= max) {
  	max *= 2;
! 	ret = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 	if (ret == NULL) {
! 	    xmlGenericError(xmlGenericErrorContext,
! 		    "xmlSaveUri: out of memory\n");
! 	    return(NULL);
! 	}
      }
      ret[len++] = 0;
      return(ret);
--- 606,619 ----
      }
      if (len >= max) {
  	max *= 2;
! 	temp = (xmlChar *) xmlRealloc(ret, (max + 1) * sizeof(xmlChar));
! 	if (temp == NULL) {
! 			xmlGenericError(xmlGenericErrorContext,
! 				"xmlSaveUri: out of memory\n");
!                      xmlFree(ret);
! 			return(NULL);
! 		    }
! 		    ret = temp;
      }
      ret[len++] = 0;
      return(ret);
*************** xmlURIUnescapeString(const char *str, in
*** 928,933 ****
--- 967,973 ----
  xmlChar *
  xmlURIEscapeStr(const xmlChar *str, const xmlChar *list) {
      xmlChar *ret, ch;
+     xmlChar *temp;
      const xmlChar *in;
  
      unsigned int len, out;
*************** xmlURIEscapeStr(const xmlChar *str, cons
*** 951,962 ****
      while(*in != 0) {
  	if (len - out <= 3) {
  	    len += 20;
! 	    ret = (xmlChar *) xmlRealloc(ret, len);
! 	    if (ret == NULL) {
  		xmlGenericError(xmlGenericErrorContext,
  			"xmlURIEscapeStr: out of memory\n");
  		return(NULL);
  	    }
  	}
  
  	ch = *in;
--- 991,1004 ----
      while(*in != 0) {
  	if (len - out <= 3) {
  	    len += 20;
! 	    temp = (xmlChar *) xmlRealloc(ret, len);
! 	    if (temp == NULL) {
  		xmlGenericError(xmlGenericErrorContext,
  			"xmlURIEscapeStr: out of memory\n");
+ 		xmlFree(ret);
  		return(NULL);
  	    }
+ 	    ret = temp;
  	}
  
  	ch = *in;
*************** xmlURIEscape(const xmlChar * str)
*** 1009,1015 ****
  #define NULLCHK(p) if(!p) { \
                     xmlGenericError(xmlGenericErrorContext, \
                          "xmlURIEscape: out of memory\n"); \
!                    return NULL; }
  
      if (str == NULL)
          return (NULL);
--- 1051,1058 ----
  #define NULLCHK(p) if(!p) { \
                     xmlGenericError(xmlGenericErrorContext, \
                          "xmlURIEscape: out of memory\n"); \
!                         xmlFreeURI(uri); \
!                         return NULL; } \
  
      if (str == NULL)
          return (NULL);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]