mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2024-12-23 17:33:50 +03:00
Fix various bugs in new code raised by the API checking
* testapi.c: regenerated and covering new APIs * tree.c: xmlBufferDetach can't work on immutable buffers * xzlib.c: fix a deallocation error
This commit is contained in:
parent
79ee284abb
commit
94431ecba6
94
testapi.c
94
testapi.c
@ -1040,8 +1040,8 @@ static void des_xmlAttributeType(int no ATTRIBUTE_UNUSED, xmlAttributeType val A
|
||||
static xmlBufferAllocationScheme gen_xmlBufferAllocationScheme(int no, int nr ATTRIBUTE_UNUSED) {
|
||||
if (no == 1) return(XML_BUFFER_ALLOC_DOUBLEIT);
|
||||
if (no == 2) return(XML_BUFFER_ALLOC_EXACT);
|
||||
if (no == 3) return(XML_BUFFER_ALLOC_IMMUTABLE);
|
||||
if (no == 4) return(XML_BUFFER_ALLOC_IO);
|
||||
if (no == 3) return(XML_BUFFER_ALLOC_HYBRID);
|
||||
if (no == 4) return(XML_BUFFER_ALLOC_IMMUTABLE);
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -18613,6 +18613,38 @@ test_xmlBufferCreateStatic(void) {
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
test_xmlBufferDetach(void) {
|
||||
int test_ret = 0;
|
||||
|
||||
int mem_base;
|
||||
xmlChar * ret_val;
|
||||
xmlBufferPtr buf; /* the buffer */
|
||||
int n_buf;
|
||||
|
||||
for (n_buf = 0;n_buf < gen_nb_xmlBufferPtr;n_buf++) {
|
||||
mem_base = xmlMemBlocks();
|
||||
buf = gen_xmlBufferPtr(n_buf, 0);
|
||||
|
||||
ret_val = xmlBufferDetach(buf);
|
||||
desret_xmlChar_ptr(ret_val);
|
||||
call_tests++;
|
||||
des_xmlBufferPtr(n_buf, buf, 0);
|
||||
xmlResetLastError();
|
||||
if (mem_base != xmlMemBlocks()) {
|
||||
printf("Leak of %d blocks found in xmlBufferDetach",
|
||||
xmlMemBlocks() - mem_base);
|
||||
test_ret++;
|
||||
printf(" %d", n_buf);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
function_tests++;
|
||||
|
||||
return(test_ret);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
test_xmlBufferEmpty(void) {
|
||||
int test_ret = 0;
|
||||
@ -18770,9 +18802,7 @@ test_xmlBufferSetAllocationScheme(void) {
|
||||
scheme = gen_xmlBufferAllocationScheme(n_scheme, 1);
|
||||
|
||||
xmlBufferSetAllocationScheme(buf, scheme);
|
||||
if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) {
|
||||
xmlFree(buf->content); buf->content = NULL;
|
||||
}
|
||||
if ((buf != NULL) && (scheme == XML_BUFFER_ALLOC_IMMUTABLE) && (buf->content != NULL) && (buf->content != static_buf_content)) { xmlFree(buf->content); buf->content = NULL;}
|
||||
call_tests++;
|
||||
des_xmlBufferPtr(n_buf, buf, 0);
|
||||
des_xmlBufferAllocationScheme(n_scheme, scheme, 1);
|
||||
@ -23959,7 +23989,7 @@ static int
|
||||
test_tree(void) {
|
||||
int test_ret = 0;
|
||||
|
||||
if (quiet == 0) printf("Testing tree : 138 of 157 functions ...\n");
|
||||
if (quiet == 0) printf("Testing tree : 139 of 158 functions ...\n");
|
||||
test_ret += test_xmlAddChild();
|
||||
test_ret += test_xmlAddChildList();
|
||||
test_ret += test_xmlAddNextSibling();
|
||||
@ -23974,6 +24004,7 @@ test_tree(void) {
|
||||
test_ret += test_xmlBufferCreate();
|
||||
test_ret += test_xmlBufferCreateSize();
|
||||
test_ret += test_xmlBufferCreateStatic();
|
||||
test_ret += test_xmlBufferDetach();
|
||||
test_ret += test_xmlBufferEmpty();
|
||||
test_ret += test_xmlBufferGrow();
|
||||
test_ret += test_xmlBufferLength();
|
||||
@ -32276,6 +32307,54 @@ test_xmlTextReaderRelaxNGValidate(void) {
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
test_xmlTextReaderRelaxNGValidateCtxt(void) {
|
||||
int test_ret = 0;
|
||||
|
||||
#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_SCHEMAS_ENABLED)
|
||||
int mem_base;
|
||||
int ret_val;
|
||||
xmlTextReaderPtr reader; /* the xmlTextReaderPtr used */
|
||||
int n_reader;
|
||||
xmlRelaxNGValidCtxtPtr ctxt; /* the RelaxNG schema validation context or NULL */
|
||||
int n_ctxt;
|
||||
int options; /* options (not used yet) */
|
||||
int n_options;
|
||||
|
||||
for (n_reader = 0;n_reader < gen_nb_xmlTextReaderPtr;n_reader++) {
|
||||
for (n_ctxt = 0;n_ctxt < gen_nb_xmlRelaxNGValidCtxtPtr;n_ctxt++) {
|
||||
for (n_options = 0;n_options < gen_nb_parseroptions;n_options++) {
|
||||
mem_base = xmlMemBlocks();
|
||||
reader = gen_xmlTextReaderPtr(n_reader, 0);
|
||||
ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 1);
|
||||
options = gen_parseroptions(n_options, 2);
|
||||
|
||||
ret_val = xmlTextReaderRelaxNGValidateCtxt(reader, ctxt, options);
|
||||
desret_int(ret_val);
|
||||
call_tests++;
|
||||
des_xmlTextReaderPtr(n_reader, reader, 0);
|
||||
des_xmlRelaxNGValidCtxtPtr(n_ctxt, ctxt, 1);
|
||||
des_parseroptions(n_options, options, 2);
|
||||
xmlResetLastError();
|
||||
if (mem_base != xmlMemBlocks()) {
|
||||
printf("Leak of %d blocks found in xmlTextReaderRelaxNGValidateCtxt",
|
||||
xmlMemBlocks() - mem_base);
|
||||
test_ret++;
|
||||
printf(" %d", n_reader);
|
||||
printf(" %d", n_ctxt);
|
||||
printf(" %d", n_options);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function_tests++;
|
||||
#endif
|
||||
|
||||
return(test_ret);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
test_xmlTextReaderSchemaValidate(void) {
|
||||
int test_ret = 0;
|
||||
@ -32630,7 +32709,7 @@ static int
|
||||
test_xmlreader(void) {
|
||||
int test_ret = 0;
|
||||
|
||||
if (quiet == 0) printf("Testing xmlreader : 75 of 85 functions ...\n");
|
||||
if (quiet == 0) printf("Testing xmlreader : 76 of 86 functions ...\n");
|
||||
test_ret += test_xmlNewTextReader();
|
||||
test_ret += test_xmlNewTextReaderFilename();
|
||||
test_ret += test_xmlReaderForDoc();
|
||||
@ -32698,6 +32777,7 @@ test_xmlreader(void) {
|
||||
test_ret += test_xmlTextReaderReadState();
|
||||
test_ret += test_xmlTextReaderRelaxNGSetSchema();
|
||||
test_ret += test_xmlTextReaderRelaxNGValidate();
|
||||
test_ret += test_xmlTextReaderRelaxNGValidateCtxt();
|
||||
test_ret += test_xmlTextReaderSchemaValidate();
|
||||
test_ret += test_xmlTextReaderSchemaValidateCtxt();
|
||||
test_ret += test_xmlTextReaderSetErrorHandler();
|
||||
|
8
tree.c
8
tree.c
@ -6938,7 +6938,8 @@ xmlBufferCreateSize(size_t size) {
|
||||
* @buf: the buffer
|
||||
*
|
||||
* Remove the string contained in a buffer and gie it back to the
|
||||
* caller. The buffer is reset to an emoty content.
|
||||
* caller. The buffer is reset to an empty content.
|
||||
* This doesn't work with immutable buffers as they can't be reset.
|
||||
*
|
||||
* Returns the previous string contained by the buffer.
|
||||
*/
|
||||
@ -6946,7 +6947,10 @@ xmlChar *
|
||||
xmlBufferDetach(xmlBufferPtr buf) {
|
||||
xmlChar *ret;
|
||||
|
||||
if (buf == NULL) return(NULL);
|
||||
if (buf == NULL)
|
||||
return(NULL);
|
||||
if (buf->alloc == XML_BUFFER_ALLOC_IMMUTABLE)
|
||||
return(NULL);
|
||||
|
||||
ret = buf->content;
|
||||
buf->content = NULL;
|
||||
|
2
xzlib.c
2
xzlib.c
@ -273,7 +273,7 @@ is_format_lzma(xz_statep state)
|
||||
|
||||
opt = filter.options;
|
||||
dict_size = opt->dict_size;
|
||||
xmlFree(opt);
|
||||
free(opt); /* we can't use xmlFree on a string returned by zlib */
|
||||
|
||||
/* A hack to ditch tons of false positives: We allow only dictionary
|
||||
* sizes that are 2^n or 2^n + 2^(n-1) or UINT32_MAX. LZMA_Alone
|
||||
|
Loading…
Reference in New Issue
Block a user