summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/encoding.c b/encoding.c
index d1140bf..d486dd6 100644
--- a/encoding.c
+++ b/encoding.c
@@ -1928,7 +1928,7 @@ xmlCharEncFirstLineInt(xmlCharEncodingHandler *handler, xmlBufferPtr out,
if (in == NULL) return(-1);
/* calculate space available */
- written = out->size - out->use;
+ written = out->size - out->use - 1; /* count '\0' */
toconv = in->use;
/*
* echo '<?xml version="1.0" encoding="UCS4"?>' | wc -c => 38
@@ -2059,7 +2059,7 @@ xmlCharEncInFunc(xmlCharEncodingHandler * handler, xmlBufferPtr out,
toconv = in->use;
if (toconv == 0)
return (0);
- written = out->size - out->use;
+ written = out->size - out->use -1; /* count '\0' */
if (toconv * 2 >= written) {
xmlBufferGrow(out, out->size + toconv * 2);
written = out->size - out->use - 1;
@@ -2161,6 +2161,7 @@ xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out,
int writtentot = 0;
int toconv;
int output = 0;
+ int charref_len = 0;
if (handler == NULL) return(-1);
if (out == NULL) return(-1);
@@ -2242,6 +2243,7 @@ retry:
/*
* Can be a limitation of iconv
*/
+ charref_len = 0;
goto retry;
}
ret = -3;
@@ -2262,6 +2264,7 @@ retry:
/*
* Can be a limitation of iconv
*/
+ charref_len = 0;
goto retry;
}
ret = -3;
@@ -2305,7 +2308,19 @@ retry:
int cur;
cur = xmlGetUTF8Char(utf, &len);
- if (cur > 0) {
+ if ((charref_len != 0) && (written < charref_len)) {
+ /*
+ * We attempted to insert a character reference and failed.
+ * Undo what was written and skip the remaining charref.
+ */
+ out->use -= written;
+ writtentot -= written;
+ xmlBufferShrink(in, charref_len - written);
+ charref_len = 0;
+
+ ret = -1;
+ break;
+ } else if (cur > 0) {
xmlChar charref[20];
#ifdef DEBUG_ENCODING
@@ -2321,7 +2336,8 @@ retry:
* and continue the transcoding phase, hoping the error
* did not mangle the encoder state.
*/
- snprintf((char *) &charref[0], sizeof(charref), "&#%d;", cur);
+ charref_len = snprintf((char *) &charref[0], sizeof(charref),
+ "&#%d;", cur);
xmlBufferShrink(in, len);
xmlBufferAddHead(in, charref, -1);