summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/input/filter.c25
-rw-r--r--test/INDEX1
-rw-r--r--test/Makefile2
-rw-r--r--test/regression/filter-badenc-segv.c50
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;
+
}
diff --git a/test/INDEX b/test/INDEX
index ef92b47..bcd782a 100644
--- a/test/INDEX
+++ b/test/INDEX
@@ -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, &params) ==
+ PARSERUTILS_BADENCODING);
+
+ params.encoding.name = "GBK";
+ assert(parserutils_filter_setopt(input,
+ PARSERUTILS_FILTER_SET_ENCODING, &params) ==
+ PARSERUTILS_BADENCODING);
+
+ parserutils_filter_destroy(input);
+
+ assert(parserutils_finalise(myrealloc, NULL) == PARSERUTILS_OK);
+
+ printf("PASS\n");
+
+ return 0;
+}