1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2024-10-26 12:25:09 +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:
Nick Wellnhofer 2023-12-10 15:18:55 +01:00
parent f313848bd8
commit c37a9051b0

49
buf.c
View File

@ -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 {