mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-02-05 05:47:00 +03:00
buf: Stop invoking global error handler
Memory errors from low-level code should be handled by higher layers.
This commit is contained in:
parent
f313848bd8
commit
c37a9051b0
49
buf.c
49
buf.c
@ -89,10 +89,9 @@ struct _xmlBuf {
|
||||
* To be improved...
|
||||
*/
|
||||
static void
|
||||
xmlBufMemoryError(xmlBufPtr buf, const char *extra)
|
||||
xmlBufMemoryError(xmlBufPtr buf)
|
||||
{
|
||||
__xmlSimpleError(XML_FROM_BUFFER, XML_ERR_NO_MEMORY, NULL, NULL, extra);
|
||||
if ((buf) && (buf->error == 0))
|
||||
if (buf->error == 0)
|
||||
buf->error = XML_ERR_NO_MEMORY;
|
||||
}
|
||||
|
||||
@ -104,10 +103,9 @@ xmlBufMemoryError(xmlBufPtr buf, const char *extra)
|
||||
* To be improved...
|
||||
*/
|
||||
static void
|
||||
xmlBufOverflowError(xmlBufPtr buf, const char *extra)
|
||||
xmlBufOverflowError(xmlBufPtr buf)
|
||||
{
|
||||
__xmlSimpleError(XML_FROM_BUFFER, XML_BUF_OVERFLOW, NULL, NULL, extra);
|
||||
if ((buf) && (buf->error == 0))
|
||||
if (buf->error == 0)
|
||||
buf->error = XML_BUF_OVERFLOW;
|
||||
}
|
||||
|
||||
@ -123,10 +121,8 @@ xmlBufCreate(void) {
|
||||
xmlBufPtr ret;
|
||||
|
||||
ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf));
|
||||
if (ret == NULL) {
|
||||
xmlBufMemoryError(NULL, "creating buffer");
|
||||
if (ret == NULL)
|
||||
return(NULL);
|
||||
}
|
||||
ret->use = 0;
|
||||
ret->error = 0;
|
||||
ret->buffer = NULL;
|
||||
@ -135,7 +131,6 @@ xmlBufCreate(void) {
|
||||
ret->alloc = xmlBufferAllocScheme;
|
||||
ret->content = (xmlChar *) xmlMallocAtomic(ret->size);
|
||||
if (ret->content == NULL) {
|
||||
xmlBufMemoryError(ret, "creating buffer");
|
||||
xmlFree(ret);
|
||||
return(NULL);
|
||||
}
|
||||
@ -158,10 +153,8 @@ xmlBufCreateSize(size_t size) {
|
||||
if (size == SIZE_MAX)
|
||||
return(NULL);
|
||||
ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf));
|
||||
if (ret == NULL) {
|
||||
xmlBufMemoryError(NULL, "creating buffer");
|
||||
if (ret == NULL)
|
||||
return(NULL);
|
||||
}
|
||||
ret->use = 0;
|
||||
ret->error = 0;
|
||||
ret->buffer = NULL;
|
||||
@ -171,7 +164,6 @@ xmlBufCreateSize(size_t size) {
|
||||
if (ret->size){
|
||||
ret->content = (xmlChar *) xmlMallocAtomic(ret->size);
|
||||
if (ret->content == NULL) {
|
||||
xmlBufMemoryError(ret, "creating buffer");
|
||||
xmlFree(ret);
|
||||
return(NULL);
|
||||
}
|
||||
@ -383,7 +375,7 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) {
|
||||
if (len < buf->size - buf->use)
|
||||
return(buf->size - buf->use - 1);
|
||||
if (len >= SIZE_MAX - buf->use) {
|
||||
xmlBufMemoryError(buf, "growing buffer past SIZE_MAX");
|
||||
xmlBufMemoryError(buf);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -400,7 +392,7 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) {
|
||||
*/
|
||||
if ((buf->use + len + 1 >= XML_MAX_TEXT_LENGTH) ||
|
||||
(buf->size >= XML_MAX_TEXT_LENGTH)) {
|
||||
xmlBufMemoryError(buf, "buffer error: text too long\n");
|
||||
xmlBufMemoryError(buf);
|
||||
return(0);
|
||||
}
|
||||
if (size >= XML_MAX_TEXT_LENGTH)
|
||||
@ -411,7 +403,7 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) {
|
||||
|
||||
newbuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + size);
|
||||
if (newbuf == NULL) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return(0);
|
||||
}
|
||||
buf->contentIO = newbuf;
|
||||
@ -419,7 +411,7 @@ xmlBufGrowInternal(xmlBufPtr buf, size_t len) {
|
||||
} else {
|
||||
newbuf = (xmlChar *) xmlRealloc(buf->content, size);
|
||||
if (newbuf == NULL) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return(0);
|
||||
}
|
||||
buf->content = newbuf;
|
||||
@ -641,7 +633,7 @@ xmlBufResize(xmlBufPtr buf, size_t size)
|
||||
* Used to provide parsing limits
|
||||
*/
|
||||
if (size >= XML_MAX_TEXT_LENGTH) {
|
||||
xmlBufMemoryError(buf, "buffer error: text too long\n");
|
||||
xmlBufMemoryError(buf);
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
@ -662,7 +654,7 @@ xmlBufResize(xmlBufPtr buf, size_t size)
|
||||
}
|
||||
while (size > newSize) {
|
||||
if (newSize > SIZE_MAX / 2) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return 0;
|
||||
}
|
||||
newSize *= 2;
|
||||
@ -678,7 +670,7 @@ xmlBufResize(xmlBufPtr buf, size_t size)
|
||||
newSize = buf->size;
|
||||
while (size > newSize) {
|
||||
if (newSize > SIZE_MAX / 2) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return 0;
|
||||
}
|
||||
newSize *= 2;
|
||||
@ -703,7 +695,7 @@ xmlBufResize(xmlBufPtr buf, size_t size)
|
||||
} else {
|
||||
rebuf = (xmlChar *) xmlRealloc(buf->contentIO, start_buf + newSize);
|
||||
if (rebuf == NULL) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return 0;
|
||||
}
|
||||
buf->contentIO = rebuf;
|
||||
@ -731,7 +723,7 @@ xmlBufResize(xmlBufPtr buf, size_t size)
|
||||
}
|
||||
}
|
||||
if (rebuf == NULL) {
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return 0;
|
||||
}
|
||||
buf->content = rebuf;
|
||||
@ -776,7 +768,7 @@ xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len) {
|
||||
/* Note that both buf->size and buf->use can be zero here. */
|
||||
if ((size_t) len >= buf->size - buf->use) {
|
||||
if ((size_t) len >= SIZE_MAX - buf->use) {
|
||||
xmlBufMemoryError(buf, "growing buffer past SIZE_MAX");
|
||||
xmlBufMemoryError(buf);
|
||||
return(-1);
|
||||
}
|
||||
needSize = buf->use + len + 1;
|
||||
@ -785,12 +777,12 @@ xmlBufAdd(xmlBufPtr buf, const xmlChar *str, int len) {
|
||||
* Used to provide parsing limits
|
||||
*/
|
||||
if (needSize >= XML_MAX_TEXT_LENGTH) {
|
||||
xmlBufMemoryError(buf, "buffer error: text too long\n");
|
||||
xmlBufMemoryError(buf);
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
if (!xmlBufResize(buf, needSize)){
|
||||
xmlBufMemoryError(buf, "growing buffer");
|
||||
xmlBufMemoryError(buf);
|
||||
return XML_ERR_NO_MEMORY;
|
||||
}
|
||||
}
|
||||
@ -907,7 +899,6 @@ xmlBufFromBuffer(xmlBufferPtr buffer) {
|
||||
|
||||
ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf));
|
||||
if (ret == NULL) {
|
||||
xmlBufMemoryError(NULL, "creating buffer");
|
||||
return(NULL);
|
||||
}
|
||||
ret->use = buffer->use;
|
||||
@ -956,7 +947,7 @@ xmlBufBackToBuffer(xmlBufPtr buf) {
|
||||
* maximum allowed memory for an xmlBuffer on this architecture.
|
||||
* Keep the buffer but provide a truncated size value.
|
||||
*/
|
||||
xmlBufOverflowError(buf, "Used size too big for xmlBuffer");
|
||||
xmlBufOverflowError(buf);
|
||||
ret->use = INT_MAX;
|
||||
ret->size = INT_MAX;
|
||||
} else if (buf->size > INT_MAX) {
|
||||
@ -966,7 +957,7 @@ xmlBufBackToBuffer(xmlBufPtr buf) {
|
||||
* limit.
|
||||
* Keep the buffer but provide a truncated size value.
|
||||
*/
|
||||
xmlBufOverflowError(buf, "Allocated size too big for xmlBuffer");
|
||||
xmlBufOverflowError(buf);
|
||||
ret->use = buf->use;
|
||||
ret->size = INT_MAX;
|
||||
} else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user