pick fix segfault
authorPhilipp Takacs <philipp@bureaucracy.de>
Wed, 2 Jan 2019 15:14:21 +0000 (16:14 +0100)
committerPhilipp Takacs <philipp@bureaucracy.de>
Wed, 2 Jan 2019 15:14:21 +0000 (16:14 +0100)
pick now copy the static memory which is later freed.
Also fix the access to uninitialized variable in getthreadid().
Thanks c_14 for reporting.

sbr/getthreadid.c
test/tests/pick/test-thread [new file with mode: 0644]
test/tests/pick/test-thread-without-msgid [new file with mode: 0644]
uip/pick.c

index 99a7d67..41e3e22 100644 (file)
@@ -47,6 +47,9 @@ threadid(char *msgid, char *referens)
        char *cp;
 
        threadfrom = referens ? referens : msgid;
+       if (!threadfrom) {
+               return NULL;
+       }
 
        start = strchr(threadfrom, '<');
        end = strchr(start, '>');
diff --git a/test/tests/pick/test-thread b/test/tests/pick/test-thread
new file mode 100644 (file)
index 0000000..0397e11
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+######################################################
+#
+# Test that the -thread option works.
+#
+######################################################
+
+expected_err=$MH_TEST_DIR/$$.expected_err
+expected_out=$MH_TEST_DIR/$$.expected_out
+actual_err=$MH_TEST_DIR/$$.actual_err
+actual_out=$MH_TEST_DIR/$$.actual_out
+
+# All messages should be go to stdout
+cp `mhpath 5` 5.old
+anno -component 'Message-Id' -text '<testid>' 5 -nodate
+cat > $expected_out <<EOF
+5
+EOF
+# Nothing should to go stderr
+cat /dev/null > $expected_err
+
+pick -thread 5 > $actual_out 2> $actual_err
+mv 5.old `mhpath 5`
+diff -u $expected_err $actual_err
+diff -u $expected_out $actual_out
diff --git a/test/tests/pick/test-thread-without-msgid b/test/tests/pick/test-thread-without-msgid
new file mode 100644 (file)
index 0000000..d693439
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+######################################################
+#
+# Test that the -thread option works.
+#
+######################################################
+
+expected_err=$MH_TEST_DIR/$$.expected_err
+expected_out=$MH_TEST_DIR/$$.expected_out
+actual_err=$MH_TEST_DIR/$$.actual_err
+actual_out=$MH_TEST_DIR/$$.actual_out
+
+# All messages should be go to stdout
+cat > $expected_out <<EOF
+5
+EOF
+# Nothing should to go stderr
+cat /dev/null > $expected_err
+
+pick -thread 5 > $actual_out 2> $actual_err
+diff -u $expected_err $actual_err
+diff -u $expected_out $actual_out
index aba0c02..049be8a 100644 (file)
@@ -1366,7 +1366,7 @@ createonethread(char *c)
 
        bd->left = left;
        bd->right = right;
-       gd->header = "message-id";
+       gd->header = mh_xstrdup("message-id");
 
        snprintf(buf, sizeof(buf), "^[ \t]*<%s>", c);
        if(!gcompile(gd, buf)) {
@@ -1375,7 +1375,7 @@ createonethread(char *c)
        }
 
        gd = right->data;
-       gd->header = "references";
+       gd->header = mh_xstrdup("references");
 
        snprintf(buf, sizeof(buf), "^[ \t]*<%s>", c);
        if(!gcompile(gd, buf)) {