diff options
-rw-r--r-- | src/input/filter.c | 25 | ||||
-rw-r--r-- | test/INDEX | 1 | ||||
-rw-r--r-- | test/Makefile | 2 | ||||
-rw-r--r-- | test/regression/filter-badenc-segv.c | 50 |
4 files changed, 71 insertions, 7 deletions
diff --git a/src/input/filter.c b/src/input/filter.c index 716fbf6..d6457f3 100644 --- a/src/input/filter.c +++ b/src/input/filter.c @@ -100,8 +100,10 @@ parserutils_error parserutils_filter_create(const char *int_enc, error = parserutils_charset_codec_create(int_enc, alloc, pw, &f->write_codec); if (error != PARSERUTILS_OK) { - if (f->read_codec != NULL) + if (f->read_codec != NULL) { parserutils_charset_codec_destroy(f->read_codec); + f->read_codec = NULL; + } f->alloc(f, 0, pw); return error; } @@ -124,14 +126,20 @@ parserutils_error parserutils_filter_destroy(parserutils_filter *input) return PARSERUTILS_BADPARM; #ifdef WITH_ICONV_FILTER - if (input->cd != (iconv_t) -1) + if (input->cd != (iconv_t) -1) { iconv_close(input->cd); + input->cd = (iconv_t) -1; + } #else - if (input->read_codec != NULL) + if (input->read_codec != NULL) { parserutils_charset_codec_destroy(input->read_codec); + input->read_codec = NULL; + } - if (input->write_codec != NULL) + if (input->write_codec != NULL) { parserutils_charset_codec_destroy(input->write_codec); + input->write_codec = NULL; + } #endif input->alloc(input, 0, input->pw); @@ -383,16 +391,20 @@ parserutils_error filter_set_encoding(parserutils_filter *input, old_enc = "UTF-8"; #ifdef WITH_ICONV_FILTER - if (input->cd != (iconv_t) -1) + if (input->cd != (iconv_t) -1) { iconv_close(input->cd); + input->cd = (iconv_t) -1; + } input->cd = iconv_open( parserutils_charset_mibenum_to_name(input->int_enc), enc); if (input->cd == (iconv_t) -1) return PARSERUTILS_NOMEM; #else - if (input->read_codec != NULL) + if (input->read_codec != NULL) { parserutils_charset_codec_destroy(input->read_codec); + input->read_codec = NULL; + } error = parserutils_charset_codec_create(enc, input->alloc, input->pw, &input->read_codec); @@ -403,4 +415,5 @@ parserutils_error filter_set_encoding(parserutils_filter *input, input->settings.encoding = mibenum; return PARSERUTILS_OK; + } @@ -18,3 +18,4 @@ inputstream Inputstream handling input regression/cscodec-segv Segfault in charset codecs regression/filter-segv Segfault in input filtering regression/stream-nomem Inputstream buffer expansion +regression/filter-badenc-segv Segfault on resetting bad encoding in filter diff --git a/test/Makefile b/test/Makefile index fecfca4..0786f5d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -38,7 +38,7 @@ CFLAGS := $(CFLAGS) -I$(TOP)/src/ -I$(d) TESTS_$(d) := aliases cscodec-8859 cscodec-ext8 cscodec-utf8 cscodec-utf16 \ charset dict filter inputstream parserutils rbtree TESTS_$(d) := $(TESTS_$(d)) regression/cscodec-segv regression/filter-segv \ - regression/stream-nomem + regression/stream-nomem regression/filter-badenc-segv # Items for top-level makefile to use ITEMS_CLEAN := $(ITEMS_CLEAN) \ diff --git a/test/regression/filter-badenc-segv.c b/test/regression/filter-badenc-segv.c new file mode 100644 index 0000000..c6c07f6 --- /dev/null +++ b/test/regression/filter-badenc-segv.c @@ -0,0 +1,50 @@ +#include <stdio.h> +#include <stdlib.h> + +#include <parserutils/parserutils.h> + +#include "input/filter.h" + +#include "testutils.h" + +static void *myrealloc(void *ptr, size_t len, void *pw) +{ + UNUSED(pw); + + return realloc(ptr, len); +} + +int main(int argc, char **argv) +{ + parserutils_filter *input; + parserutils_filter_optparams params; + + if (argc != 2) { + printf("Usage: %s <filename>\n", argv[0]); + return 1; + } + + assert(parserutils_initialise(argv[1], myrealloc, NULL) == + PARSERUTILS_OK); + + assert(parserutils_filter_create("UTF-8", myrealloc, NULL, &input) == + PARSERUTILS_OK); + + params.encoding.name = "GBK"; + assert(parserutils_filter_setopt(input, + PARSERUTILS_FILTER_SET_ENCODING, ¶ms) == + PARSERUTILS_BADENCODING); + + params.encoding.name = "GBK"; + assert(parserutils_filter_setopt(input, + PARSERUTILS_FILTER_SET_ENCODING, ¶ms) == + PARSERUTILS_BADENCODING); + + parserutils_filter_destroy(input); + + assert(parserutils_finalise(myrealloc, NULL) == PARSERUTILS_OK); + + printf("PASS\n"); + + return 0; +} |