From: Alexander Kanavin <alex.kanavin@gmail.com>
To: openembedded-core@lists.openembedded.org
Subject: [PATCH 28/30] sudo: update to 1.8.29
Date: Thu, 12 Dec 2019 19:14:34 +0100 [thread overview]
Message-ID: <20191212181436.1322-28-alex.kanavin@gmail.com> (raw)
In-Reply-To: <20191212181436.1322-1-alex.kanavin@gmail.com>
License-Update: added SPDX info.
Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
---
meta/recipes-extended/sudo/sudo.inc | 22 +--
.../sudo/sudo/CVE-2019-14287-1.patch | 178 ------------------
.../sudo/sudo/CVE-2019-14287-2.patch | 112 -----------
.../sudo/{sudo_1.8.27.bb => sudo_1.8.29.bb} | 6 +-
4 files changed, 13 insertions(+), 305 deletions(-)
delete mode 100644 meta/recipes-extended/sudo/sudo/CVE-2019-14287-1.patch
delete mode 100644 meta/recipes-extended/sudo/sudo/CVE-2019-14287-2.patch
rename meta/recipes-extended/sudo/{sudo_1.8.27.bb => sudo_1.8.29.bb} (87%)
diff --git a/meta/recipes-extended/sudo/sudo.inc b/meta/recipes-extended/sudo/sudo.inc
index 15075bcefd7..67815fa8584 100644
--- a/meta/recipes-extended/sudo/sudo.inc
+++ b/meta/recipes-extended/sudo/sudo.inc
@@ -5,17 +5,17 @@ BUGTRACKER = "http://www.sudo.ws/bugs/"
SECTION = "admin"
LICENSE = "ISC & BSD & Zlib"
LIC_FILES_CHKSUM = "file://doc/LICENSE;md5=6c76b73603ac7763ab0516ebfbe67b42 \
- file://plugins/sudoers/redblack.c;beginline=1;endline=46;md5=4a162fc04b86b03f5632180fe6076cda \
- file://lib/util/reallocarray.c;beginline=3;endline=15;md5=b47f1f85a12f05a0744cd8b1b6f41a0d \
- file://lib/util/fnmatch.c;beginline=3;endline=27;md5=67f83ee9bd456557397082f8f1be0efd \
- file://lib/util/getcwd.c;beginline=2;endline=27;md5=09068a19b4f6b6f0a0958655bfe98b63 \
- file://lib/util/glob.c;beginline=2;endline=31;md5=1f2f771c35fb0658d567a7824007e56d \
- file://lib/util/snprintf.c;beginline=3;endline=33;md5=63e48e1b992bce749a19dd9b2256e9a0 \
- file://include/sudo_queue.h;beginline=2;endline=27;md5=082b138b72ba3e568a13a25c3bf254dc \
- file://lib/util/inet_pton.c;beginline=3;endline=17;md5=3970ab0518ab79cbd0bafb697f10b33a \
- file://lib/util/arc4random.c;beginline=3;endline=20;md5=15bdc89c1b003fa4d7353e6296ebfd68 \
- file://lib/util/arc4random_uniform.c;beginline=3;endline=17;md5=31e630ac814d692fd0ab7a942659b46f \
- file://lib/util/getentropy.c;beginline=1;endline=19;md5=9f1a275ecd44cc264a2a4d5e06a75292 \
+ file://plugins/sudoers/redblack.c;beginline=1;endline=46;md5=03e35317699ba00b496251e0dfe9f109 \
+ file://lib/util/reallocarray.c;beginline=3;endline=15;md5=397dd45c7683e90b9f8bf24638cf03bf \
+ file://lib/util/fnmatch.c;beginline=3;endline=27;md5=004d7d2866ba1f5b41174906849d2e0f \
+ file://lib/util/getcwd.c;beginline=2;endline=27;md5=50f8d9667750e18dea4e84a935c12009 \
+ file://lib/util/glob.c;beginline=2;endline=31;md5=2852f68687544e3eb8a0a61665506f0e \
+ file://lib/util/snprintf.c;beginline=3;endline=33;md5=b70df6179969e38fcf68da91b53b8029 \
+ file://include/sudo_queue.h;beginline=2;endline=27;md5=ad578e9664d17a010b63e4bc0576ee8d \
+ file://lib/util/inet_pton.c;beginline=3;endline=17;md5=27785c9f5835093eda42aa0816a2d0b4 \
+ file://lib/util/arc4random.c;beginline=3;endline=20;md5=ced8636ecefa2ba907cfe390bc3bd964 \
+ file://lib/util/arc4random_uniform.c;beginline=3;endline=17;md5=e30c2b777cdc00cfcaf7c445a10b262f \
+ file://lib/util/getentropy.c;beginline=1;endline=19;md5=a0f58be3d60b6dcd898ec5fe0866d36f \
"
inherit autotools
diff --git a/meta/recipes-extended/sudo/sudo/CVE-2019-14287-1.patch b/meta/recipes-extended/sudo/sudo/CVE-2019-14287-1.patch
deleted file mode 100644
index 2a11e3f7ec7..00000000000
--- a/meta/recipes-extended/sudo/sudo/CVE-2019-14287-1.patch
+++ /dev/null
@@ -1,178 +0,0 @@
-From f752ae5cee163253730ff7cdf293e34a91aa5520 Mon Sep 17 00:00:00 2001
-From: "Todd C. Miller" <Todd.Miller@sudo.ws>
-Date: Thu, 10 Oct 2019 10:04:13 -0600
-Subject: [PATCH] Treat an ID of -1 as invalid since that means "no change".
- Fixes CVE-2019-14287. Found by Joe Vennix from Apple Information Security.
-
-Upstream-Status: Backport [https://github.com/sudo-project/sudo/commit/f752ae5cee163253730ff7cdf293e34a91aa5520]
-CVE: CVE-2019-14287
-
-Signed-off-by: Changqing Li <changqing.li@windriver.com>
-
----
- lib/util/strtoid.c | 100 ++++++++++++++++++++++++++++-------------------------
- 1 files changed, 53 insertions(+), 46 deletions(-)
-
-diff --git a/lib/util/strtoid.c b/lib/util/strtoid.c
-index 2dfce75..6b3916b 100644
---- a/lib/util/strtoid.c
-+++ b/lib/util/strtoid.c
-@@ -49,6 +49,27 @@
- #include "sudo_util.h"
-
- /*
-+ * Make sure that the ID ends with a valid separator char.
-+ */
-+static bool
-+valid_separator(const char *p, const char *ep, const char *sep)
-+{
-+ bool valid = false;
-+ debug_decl(valid_separator, SUDO_DEBUG_UTIL)
-+
-+ if (ep != p) {
-+ /* check for valid separator (including '\0') */
-+ if (sep == NULL)
-+ sep = "";
-+ do {
-+ if (*ep == *sep)
-+ valid = true;
-+ } while (*sep++ != '\0');
-+ }
-+ debug_return_bool(valid);
-+}
-+
-+/*
- * Parse a uid/gid in string form.
- * If sep is non-NULL, it contains valid separator characters (e.g. comma, space)
- * If endp is non-NULL it is set to the next char after the ID.
-@@ -62,36 +83,33 @@ sudo_strtoid_v1(const char *p, const char *sep, char **endp, const char **errstr
- char *ep;
- id_t ret = 0;
- long long llval;
-- bool valid = false;
- debug_decl(sudo_strtoid, SUDO_DEBUG_UTIL)
-
- /* skip leading space so we can pick up the sign, if any */
- while (isspace((unsigned char)*p))
- p++;
-- if (sep == NULL)
-- sep = "";
-+
-+ /* While id_t may be 64-bit signed, uid_t and gid_t are 32-bit unsigned. */
- errno = 0;
- llval = strtoll(p, &ep, 10);
-- if (ep != p) {
-- /* check for valid separator (including '\0') */
-- do {
-- if (*ep == *sep)
-- valid = true;
-- } while (*sep++ != '\0');
-+ if ((errno == ERANGE && llval == LLONG_MAX) || llval > (id_t)UINT_MAX) {
-+ errno = ERANGE;
-+ if (errstr != NULL)
-+ *errstr = N_("value too large");
-+ goto done;
- }
-- if (!valid) {
-+ if ((errno == ERANGE && llval == LLONG_MIN) || llval < INT_MIN) {
-+ errno = ERANGE;
- if (errstr != NULL)
-- *errstr = N_("invalid value");
-- errno = EINVAL;
-+ *errstr = N_("value too small");
- goto done;
- }
-- if (errno == ERANGE) {
-- if (errstr != NULL) {
-- if (llval == LLONG_MAX)
-- *errstr = N_("value too large");
-- else
-- *errstr = N_("value too small");
-- }
-+
-+ /* Disallow id -1, which means "no change". */
-+ if (!valid_separator(p, ep, sep) || llval == -1 || llval == (id_t)UINT_MAX) {
-+ if (errstr != NULL)
-+ *errstr = N_("invalid value");
-+ errno = EINVAL;
- goto done;
- }
- ret = (id_t)llval;
-@@ -108,30 +126,15 @@ sudo_strtoid_v1(const char *p, const char *sep, char **endp, const char **errstr
- {
- char *ep;
- id_t ret = 0;
-- bool valid = false;
- debug_decl(sudo_strtoid, SUDO_DEBUG_UTIL)
-
- /* skip leading space so we can pick up the sign, if any */
- while (isspace((unsigned char)*p))
- p++;
-- if (sep == NULL)
-- sep = "";
-+
- errno = 0;
- if (*p == '-') {
- long lval = strtol(p, &ep, 10);
-- if (ep != p) {
-- /* check for valid separator (including '\0') */
-- do {
-- if (*ep == *sep)
-- valid = true;
-- } while (*sep++ != '\0');
-- }
-- if (!valid) {
-- if (errstr != NULL)
-- *errstr = N_("invalid value");
-- errno = EINVAL;
-- goto done;
-- }
- if ((errno == ERANGE && lval == LONG_MAX) || lval > INT_MAX) {
- errno = ERANGE;
- if (errstr != NULL)
-@@ -144,28 +147,31 @@ sudo_strtoid_v1(const char *p, const char *sep, char **endp, const char **errstr
- *errstr = N_("value too small");
- goto done;
- }
-- ret = (id_t)lval;
-- } else {
-- unsigned long ulval = strtoul(p, &ep, 10);
-- if (ep != p) {
-- /* check for valid separator (including '\0') */
-- do {
-- if (*ep == *sep)
-- valid = true;
-- } while (*sep++ != '\0');
-- }
-- if (!valid) {
-+
-+ /* Disallow id -1, which means "no change". */
-+ if (!valid_separator(p, ep, sep) || lval == -1) {
- if (errstr != NULL)
- *errstr = N_("invalid value");
- errno = EINVAL;
- goto done;
- }
-+ ret = (id_t)lval;
-+ } else {
-+ unsigned long ulval = strtoul(p, &ep, 10);
- if ((errno == ERANGE && ulval == ULONG_MAX) || ulval > UINT_MAX) {
- errno = ERANGE;
- if (errstr != NULL)
- *errstr = N_("value too large");
- goto done;
- }
-+
-+ /* Disallow id -1, which means "no change". */
-+ if (!valid_separator(p, ep, sep) || ulval == UINT_MAX) {
-+ if (errstr != NULL)
-+ *errstr = N_("invalid value");
-+ errno = EINVAL;
-+ goto done;
-+ }
- ret = (id_t)ulval;
- }
- if (errstr != NULL)
---
-2.7.4
-
diff --git a/meta/recipes-extended/sudo/sudo/CVE-2019-14287-2.patch b/meta/recipes-extended/sudo/sudo/CVE-2019-14287-2.patch
deleted file mode 100644
index 453a8b09a4a..00000000000
--- a/meta/recipes-extended/sudo/sudo/CVE-2019-14287-2.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From 396bc57feff3e360007634f62448b64e0626390c Mon Sep 17 00:00:00 2001
-From: "Todd C. Miller" <Todd.Miller@sudo.ws>
-Date: Thu, 10 Oct 2019 10:04:13 -0600
-Subject: [PATCH] Add sudo_strtoid() tests for -1 and range errors. Also adjust
- testsudoers/test5 which relied upon gid -1 parsing.
-
-Upstream-Status: Backport [https://github.com/sudo-project/sudo/commit/396bc57]
-CVE: CVE-2019-14287
-
-Signed-off-by: Changqing Li <changqing.li@windriver.com>
-
----
- lib/util/regress/atofoo/atofoo_test.c | 36 ++++++++++++++++------
- plugins/sudoers/regress/testsudoers/test5.out.ok | 2 +-
- plugins/sudoers/regress/testsudoers/test5.sh | 2 +-
- 3 files changed, 29 insertions(+), 11 deletions(-)
-
-diff --git a/lib/util/regress/atofoo/atofoo_test.c b/lib/util/regress/atofoo/atofoo_test.c
-index 031a7ed..fb41c1a 100644
---- a/lib/util/regress/atofoo/atofoo_test.c
-+++ b/lib/util/regress/atofoo/atofoo_test.c
-@@ -26,6 +26,7 @@
- #else
- # include "compat/stdbool.h"
- #endif
-+#include <errno.h>
-
- #include "sudo_compat.h"
- #include "sudo_util.h"
-@@ -80,15 +81,20 @@ static struct strtoid_data {
- id_t id;
- const char *sep;
- const char *ep;
-+ int errnum;
- } strtoid_data[] = {
-- { "0,1", 0, ",", "," },
-- { "10", 10, NULL, NULL },
-- { "-2", -2, NULL, NULL },
-+ { "0,1", 0, ",", ",", 0 },
-+ { "10", 10, NULL, NULL, 0 },
-+ { "-1", 0, NULL, NULL, EINVAL },
-+ { "4294967295", 0, NULL, NULL, EINVAL },
-+ { "4294967296", 0, NULL, NULL, ERANGE },
-+ { "-2147483649", 0, NULL, NULL, ERANGE },
-+ { "-2", -2, NULL, NULL, 0 },
- #if SIZEOF_ID_T != SIZEOF_LONG_LONG
-- { "-2", (id_t)4294967294U, NULL, NULL },
-+ { "-2", (id_t)4294967294U, NULL, NULL, 0 },
- #endif
-- { "4294967294", (id_t)4294967294U, NULL, NULL },
-- { NULL, 0, NULL, NULL }
-+ { "4294967294", (id_t)4294967294U, NULL, NULL, 0 },
-+ { NULL, 0, NULL, NULL, 0 }
- };
-
- static int
-@@ -104,11 +110,23 @@ test_strtoid(int *ntests)
- (*ntests)++;
- errstr = "some error";
- value = sudo_strtoid(d->idstr, d->sep, &ep, &errstr);
-- if (errstr != NULL) {
-- if (d->id != (id_t)-1) {
-- sudo_warnx_nodebug("FAIL: %s: %s", d->idstr, errstr);
-+ if (d->errnum != 0) {
-+ if (errstr == NULL) {
-+ sudo_warnx_nodebug("FAIL: %s: missing errstr for errno %d",
-+ d->idstr, d->errnum);
-+ errors++;
-+ } else if (value != 0) {
-+ sudo_warnx_nodebug("FAIL: %s should return 0 on error",
-+ d->idstr);
-+ errors++;
-+ } else if (errno != d->errnum) {
-+ sudo_warnx_nodebug("FAIL: %s: errno mismatch, %d != %d",
-+ d->idstr, errno, d->errnum);
- errors++;
- }
-+ } else if (errstr != NULL) {
-+ sudo_warnx_nodebug("FAIL: %s: %s", d->idstr, errstr);
-+ errors++;
- } else if (value != d->id) {
- sudo_warnx_nodebug("FAIL: %s != %u", d->idstr, (unsigned int)d->id);
- errors++;
-diff --git a/plugins/sudoers/regress/testsudoers/test5.out.ok b/plugins/sudoers/regress/testsudoers/test5.out.ok
-index 5e319c9..cecf700 100644
---- a/plugins/sudoers/regress/testsudoers/test5.out.ok
-+++ b/plugins/sudoers/regress/testsudoers/test5.out.ok
-@@ -4,7 +4,7 @@ Parse error in sudoers near line 1.
- Entries for user root:
-
- Command unmatched
--testsudoers: test5.inc should be owned by gid 4294967295
-+testsudoers: test5.inc should be owned by gid 4294967294
- Parse error in sudoers near line 1.
-
- Entries for user root:
-diff --git a/plugins/sudoers/regress/testsudoers/test5.sh b/plugins/sudoers/regress/testsudoers/test5.sh
-index 9e690a6..94d585c 100755
---- a/plugins/sudoers/regress/testsudoers/test5.sh
-+++ b/plugins/sudoers/regress/testsudoers/test5.sh
-@@ -24,7 +24,7 @@ EOF
-
- # Test group writable
- chmod 664 $TESTFILE
--./testsudoers -U $MYUID -G -1 root id <<EOF
-+./testsudoers -U $MYUID -G -2 root id <<EOF
- #include $TESTFILE
- EOF
-
---
-2.7.4
-
diff --git a/meta/recipes-extended/sudo/sudo_1.8.27.bb b/meta/recipes-extended/sudo/sudo_1.8.29.bb
similarity index 87%
rename from meta/recipes-extended/sudo/sudo_1.8.27.bb
rename to meta/recipes-extended/sudo/sudo_1.8.29.bb
index 0a11a1b28f8..8da2d646318 100644
--- a/meta/recipes-extended/sudo/sudo_1.8.27.bb
+++ b/meta/recipes-extended/sudo/sudo_1.8.29.bb
@@ -3,14 +3,12 @@ require sudo.inc
SRC_URI = "https://www.sudo.ws/dist/sudo-${PV}.tar.gz \
${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \
file://0001-Include-sys-types.h-for-id_t-definition.patch \
- file://CVE-2019-14287-1.patch \
- file://CVE-2019-14287-2.patch \
"
PAM_SRC_URI = "file://sudo.pam"
-SRC_URI[md5sum] = "b5c184b13b6b5de32af630af2fd013fd"
-SRC_URI[sha256sum] = "7beb68b94471ef56d8a1036dbcdc09a7b58a949a68ffce48b83f837dd33e2ec0"
+SRC_URI[md5sum] = "b28dabff9c460f115fe74de4d6a6f79d"
+SRC_URI[sha256sum] = "ce53ffac9604e23321334d8ba8ac59ded2bcf624fdb9dbde097ab2049bf29c7c"
DEPENDS += " virtual/crypt ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}"
RDEPENDS_${PN} += " ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam-plugin-limits pam-plugin-keyinit', '', d)}"
--
2.17.1
next prev parent reply other threads:[~2019-12-12 18:15 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-12 18:14 [PATCH 01/30] rpm: upgrade to 4.15.1 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 02/30] gettext-minimal-native: update to 0.20.1 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 03/30] gettext: " Alexander Kanavin
2019-12-15 11:03 ` Richard Purdie
2019-12-16 13:25 ` Alexander Kanavin
2019-12-17 16:02 ` Alexander Kanavin
2019-12-20 8:18 ` Khem Raj
2019-12-20 13:10 ` Alexander Kanavin
2020-01-01 3:47 ` Khem Raj
2019-12-12 18:14 ` [PATCH 04/30] psmisc: revert to default autopoint exclusion Alexander Kanavin
2019-12-12 18:14 ` [PATCH 05/30] gettext: fix failing ptests Alexander Kanavin
2019-12-12 18:14 ` [PATCH 06/30] python3: update to 3.8.0 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 07/30] gstreamer1.0-python: add a patch to fix python 3.8 builds Alexander Kanavin
2019-12-15 5:21 ` Khem Raj
2019-12-15 11:00 ` Alexander Kanavin
2019-12-15 17:06 ` Khem Raj
2019-12-15 17:12 ` Alexander Kanavin
2019-12-15 17:32 ` Khem Raj
2019-12-15 17:52 ` Carlos Rafael Giani
2019-12-15 18:10 ` Alexander Kanavin
2019-12-12 18:14 ` [PATCH 08/30] shadow: update 4.6 -> 4.8 Alexander Kanavin
2019-12-17 8:51 ` Richard Purdie
2019-12-12 18:14 ` [PATCH 09/30] sysklogd: update to 2.0.3 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 10/30] libtasn1: update to 4.15.0 Alexander Kanavin
2019-12-17 8:53 ` Richard Purdie
2019-12-12 18:14 ` [PATCH 11/30] sysklogd: Fix 2.0.3 upgrade fallouts on musl Alexander Kanavin
2019-12-12 18:14 ` [PATCH 12/30] dos2unix: update to 7.4.1 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 13/30] puzzles: update to latest revision Alexander Kanavin
2019-12-12 18:14 ` [PATCH 14/30] glide: update to 0.13.3 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 15/30] bluez: update 5.50 -> 5.52 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 16/30] bluez5: disable debug output in ptests Alexander Kanavin
2019-12-12 18:14 ` [PATCH 17/30] libxml2: update to 2.9.10 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 18/30] parted: update 3.2->3.3 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 19/30] acl/attr: update to latest upstream releases Alexander Kanavin
2019-12-14 20:24 ` Khem Raj
2019-12-14 20:48 ` Alexander Kanavin
2019-12-12 18:14 ` [PATCH 20/30] lttng-modules: update to 2.11.0 Alexander Kanavin
2019-12-15 12:53 ` Richard Purdie
2019-12-15 16:20 ` Alexander Kanavin
2019-12-15 16:27 ` Bruce Ashfield
2019-12-15 16:45 ` Alexander Kanavin
2019-12-15 17:16 ` Richard Purdie
2019-12-15 17:24 ` Alexander Kanavin
2019-12-12 18:14 ` [PATCH 21/30] lttng-ust: " Alexander Kanavin
2019-12-15 5:26 ` Khem Raj
2019-12-12 18:14 ` [PATCH 22/30] lttng-tools: " Alexander Kanavin
2019-12-12 18:14 ` [PATCH 23/30] cups: update to 2.3.0 Alexander Kanavin
2019-12-13 2:55 ` Mittal, Anuj
2019-12-13 11:50 ` Alexander Kanavin
2019-12-12 18:14 ` [PATCH 24/30] man-pages: update to 5.04 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 25/30] man-db: update to 2.9.0 Alexander Kanavin
2019-12-12 18:14 ` [PATCH 26/30] ltp: update to 20190930 Alexander Kanavin
2019-12-15 5:32 ` Khem Raj
2019-12-15 11:02 ` Alexander Kanavin
2019-12-15 17:11 ` Khem Raj
2019-12-15 17:15 ` Alexander Kanavin
2019-12-12 18:14 ` [PATCH 27/30] cpio: update to 2.13 Alexander Kanavin
2019-12-12 18:14 ` Alexander Kanavin [this message]
2019-12-12 18:14 ` [PATCH 29/30] nfs-utils: update to 2.4.2 Alexander Kanavin
2019-12-15 5:23 ` Khem Raj
2019-12-12 18:14 ` [PATCH 30/30] debianutils: update to 4.9.1 Alexander Kanavin
2019-12-12 18:32 ` ✗ patchtest: failure for "rpm: upgrade to 4.15.1..." and 29 more Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191212181436.1322-28-alex.kanavin@gmail.com \
--to=alex.kanavin@gmail.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox