All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Alexander Potapenko <glider@google.com>,
	Eric Biggers <ebiggers@google.com>,
	David Howells <dhowells@redhat.com>
Subject: [PATCH 4.4 014/105] ASN.1: fix out-of-bounds read when parsing indefinite length item
Date: Fri, 15 Dec 2017 10:44:12 +0100	[thread overview]
Message-ID: <20171215092306.666775396@linuxfoundation.org> (raw)
In-Reply-To: <20171215092305.994559179@linuxfoundation.org>

4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Eric Biggers <ebiggers@google.com>

commit e0058f3a874ebb48b25be7ff79bc3b4e59929f90 upstream.

In asn1_ber_decoder(), indefinitely-sized ASN.1 items were being passed
to the action functions before their lengths had been computed, using
the bogus length of 0x80 (ASN1_INDEFINITE_LENGTH).  This resulted in
reading data past the end of the input buffer, when given a specially
crafted message.

Fix it by rearranging the code so that the indefinite length is resolved
before the action is called.

This bug was originally found by fuzzing the X.509 parser in userspace
using libFuzzer from the LLVM project.

KASAN report (cleaned up slightly):

    BUG: KASAN: slab-out-of-bounds in memcpy ./include/linux/string.h:341 [inline]
    BUG: KASAN: slab-out-of-bounds in x509_fabricate_name.constprop.1+0x1a4/0x940 crypto/asymmetric_keys/x509_cert_parser.c:366
    Read of size 128 at addr ffff880035dd9eaf by task keyctl/195

    CPU: 1 PID: 195 Comm: keyctl Not tainted 4.14.0-09238-g1d3b78bbc6e9 #26
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.0-20171110_100015-anatol 04/01/2014
    Call Trace:
     __dump_stack lib/dump_stack.c:17 [inline]
     dump_stack+0xd1/0x175 lib/dump_stack.c:53
     print_address_description+0x78/0x260 mm/kasan/report.c:252
     kasan_report_error mm/kasan/report.c:351 [inline]
     kasan_report+0x23f/0x350 mm/kasan/report.c:409
     memcpy+0x1f/0x50 mm/kasan/kasan.c:302
     memcpy ./include/linux/string.h:341 [inline]
     x509_fabricate_name.constprop.1+0x1a4/0x940 crypto/asymmetric_keys/x509_cert_parser.c:366
     asn1_ber_decoder+0xb4a/0x1fd0 lib/asn1_decoder.c:447
     x509_cert_parse+0x1c7/0x620 crypto/asymmetric_keys/x509_cert_parser.c:89
     x509_key_preparse+0x61/0x750 crypto/asymmetric_keys/x509_public_key.c:174
     asymmetric_key_preparse+0xa4/0x150 crypto/asymmetric_keys/asymmetric_type.c:388
     key_create_or_update+0x4d4/0x10a0 security/keys/key.c:850
     SYSC_add_key security/keys/keyctl.c:122 [inline]
     SyS_add_key+0xe8/0x290 security/keys/keyctl.c:62
     entry_SYSCALL_64_fastpath+0x1f/0x96

    Allocated by task 195:
     __do_kmalloc_node mm/slab.c:3675 [inline]
     __kmalloc_node+0x47/0x60 mm/slab.c:3682
     kvmalloc ./include/linux/mm.h:540 [inline]
     SYSC_add_key security/keys/keyctl.c:104 [inline]
     SyS_add_key+0x19e/0x290 security/keys/keyctl.c:62
     entry_SYSCALL_64_fastpath+0x1f/0x96

Fixes: 42d5ec27f873 ("X.509: Add an ASN.1 decoder")
Reported-by: Alexander Potapenko <glider@google.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

---
 lib/asn1_decoder.c |   47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

--- a/lib/asn1_decoder.c
+++ b/lib/asn1_decoder.c
@@ -312,42 +312,47 @@ next_op:
 
 	/* Decide how to handle the operation */
 	switch (op) {
-	case ASN1_OP_MATCH_ANY_ACT:
-	case ASN1_OP_MATCH_ANY_ACT_OR_SKIP:
-	case ASN1_OP_COND_MATCH_ANY_ACT:
-	case ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP:
-		ret = actions[machine[pc + 1]](context, hdr, tag, data + dp, len);
-		if (ret < 0)
-			return ret;
-		goto skip_data;
-
-	case ASN1_OP_MATCH_ACT:
-	case ASN1_OP_MATCH_ACT_OR_SKIP:
-	case ASN1_OP_COND_MATCH_ACT_OR_SKIP:
-		ret = actions[machine[pc + 2]](context, hdr, tag, data + dp, len);
-		if (ret < 0)
-			return ret;
-		goto skip_data;
-
 	case ASN1_OP_MATCH:
 	case ASN1_OP_MATCH_OR_SKIP:
+	case ASN1_OP_MATCH_ACT:
+	case ASN1_OP_MATCH_ACT_OR_SKIP:
 	case ASN1_OP_MATCH_ANY:
 	case ASN1_OP_MATCH_ANY_OR_SKIP:
+	case ASN1_OP_MATCH_ANY_ACT:
+	case ASN1_OP_MATCH_ANY_ACT_OR_SKIP:
 	case ASN1_OP_COND_MATCH_OR_SKIP:
+	case ASN1_OP_COND_MATCH_ACT_OR_SKIP:
 	case ASN1_OP_COND_MATCH_ANY:
 	case ASN1_OP_COND_MATCH_ANY_OR_SKIP:
-	skip_data:
+	case ASN1_OP_COND_MATCH_ANY_ACT:
+	case ASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP:
+
 		if (!(flags & FLAG_CONS)) {
 			if (flags & FLAG_INDEFINITE_LENGTH) {
+				size_t tmp = dp;
+
 				ret = asn1_find_indefinite_length(
-					data, datalen, &dp, &len, &errmsg);
+					data, datalen, &tmp, &len, &errmsg);
 				if (ret < 0)
 					goto error;
-			} else {
-				dp += len;
 			}
 			pr_debug("- LEAF: %zu\n", len);
 		}
+
+		if (op & ASN1_OP_MATCH__ACT) {
+			unsigned char act;
+
+			if (op & ASN1_OP_MATCH__ANY)
+				act = machine[pc + 1];
+			else
+				act = machine[pc + 2];
+			ret = actions[act](context, hdr, tag, data + dp, len);
+			if (ret < 0)
+				return ret;
+		}
+
+		if (!(flags & FLAG_CONS))
+			dp += len;
 		pc += asn1_op_lengths[op];
 		goto next_op;
 

  parent reply	other threads:[~2017-12-15  9:46 UTC|newest]

Thread overview: 129+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-15  9:43 [PATCH 4.4 000/105] 4.4.106-stable review Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 002/105] can: kvaser_usb: free buf in error paths Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 003/105] can: kvaser_usb: Fix comparison bug in kvaser_usb_read_bulk_callback() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 004/105] can: kvaser_usb: ratelimit errors if incomplete messages are received Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 005/105] can: kvaser_usb: cancel urb on -EPIPE and -EPROTO Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 006/105] can: ems_usb: " Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 007/105] can: esd_usb2: " Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 008/105] can: usb_8dev: " Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 009/105] virtio: release virtio index when fail to device_register Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 010/105] hv: kvp: Avoid reading past allocated blocks from KVP file Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 011/105] isa: Prevent NULL dereference in isa_bus driver callbacks Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 012/105] scsi: libsas: align sata_devices rps_resp on a cacheline Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 013/105] efi: Move some sysfs files to be read-only by root Greg Kroah-Hartman
2017-12-15  9:44 ` Greg Kroah-Hartman [this message]
2017-12-15  9:44 ` [PATCH 4.4 015/105] ASN.1: check for error from ASN1_OP_END__ACT actions Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 016/105] X.509: reject invalid BIT STRING for subjectPublicKey Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 017/105] x86/PCI: Make broadcom_postcore_init() check acpi_disabled Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 018/105] ALSA: pcm: prevent UAF in snd_pcm_info Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 019/105] ALSA: seq: Remove spurious WARN_ON() at timer check Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 020/105] ALSA: usb-audio: Fix out-of-bound error Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 021/105] ALSA: usb-audio: Add check return value for usb_string() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 022/105] iommu/vt-d: Fix scatterlist offset handling Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 023/105] s390: fix compat system call table Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 024/105] kdb: Fix handling of kallsyms_symbol_next() return value Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 025/105] drm: extra printk() wrapper macros Greg Kroah-Hartman
2017-12-15  9:44   ` Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 026/105] drm/exynos: gem: Drop NONCONTIG flag for buffers allocated without IOMMU Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 027/105] media: dvb: i2c transfers over usb cannot be done from stack Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 028/105] arm64: KVM: fix VTTBR_BADDR_MASK BUG_ON off-by-one Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 030/105] arm64: fpsimd: Prevent registers leaking from dead tasks Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 031/105] ARM: BUG if jumping to usermode address in kernel mode Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 032/105] ARM: avoid faulting on qemu Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 033/105] scsi: storvsc: Workaround for virtual DVD SCSI version Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 034/105] thp: reduce indentation level in change_huge_pmd() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 035/105] thp: fix MADV_DONTNEED vs. numa balancing race Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 036/105] mm: drop unused pmdp_huge_get_and_clear_notify() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 037/105] Revert "drm/armada: Fix compile fail" Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 038/105] Revert "spi: SPI_FSL_DSPI should depend on HAS_DMA" Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 039/105] Revert "s390/kbuild: enable modversions for symbols exported from asm" Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 040/105] vti6: Dont report path MTU below IPV6_MIN_MTU Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 041/105] ARM: OMAP2+: gpmc-onenand: propagate error on initialization failure Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 042/105] x86/hpet: Prevent might sleep splat on resume Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 043/105] selftest/powerpc: Fix false failures for skipped tests Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 044/105] module: set __jump_table alignment to 8 Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 045/105] ARM: OMAP2+: Fix device node reference counts Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 046/105] ARM: OMAP2+: Release device node after it is no longer needed Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 047/105] gpio: altera: Use handle_level_irq when configured as a level_high Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 048/105] HID: chicony: Add support for another ASUS Zen AiO keyboard Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 049/105] usb: gadget: configs: plug memory leak Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 050/105] USB: gadgetfs: Fix a potential memory leak in dev_config() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 052/105] libata: drop WARN from protocol error in ata_sff_qc_issue() Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 053/105] workqueue: trigger WARN if queue_delayed_work() is called with NULL @wq Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 054/105] scsi: lpfc: Fix crash during Hardware error recovery on SLI3 adapters Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 055/105] irqchip/crossbar: Fix incorrect type of register size Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 057/105] arm: KVM: Survive unknown traps from guests Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 058/105] arm64: " Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 059/105] spi_ks8995: fix "BUG: key accdaa28 not in .data!" Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 060/105] bnx2x: prevent crash when accessing PTP with interface down Greg Kroah-Hartman
2017-12-15  9:44 ` [PATCH 4.4 061/105] bnx2x: fix possible overrun of VFPF multicast addresses array Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 062/105] bnx2x: do not rollback VF MAC/VLAN filters we did not configure Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 063/105] ipv6: reorder icmpv6_init() and ip6_mr_init() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 064/105] crypto: s5p-sss - Fix completing crypto request in IRQ handler Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 065/105] i2c: riic: fix restart condition Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 066/105] zram: set physical queue limits to avoid array out of bounds accesses Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 067/105] netfilter: dont track fragmented packets Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 068/105] axonram: Fix gendisk handling Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 069/105] drm/amd/amdgpu: fix console deadlock if late init failed Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 070/105] powerpc/powernv/ioda2: Gracefully fail if too many TCE levels requested Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 073/105] kbuild: pkg: use --transform option to prefix paths in tar Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 074/105] mac80211_hwsim: Fix memory leak in hwsim_new_radio_nl() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 075/105] route: also update fnhe_genid when updating a route cache Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 076/105] route: update fnhe_expires for redirect when the fnhe exists Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 077/105] lib/genalloc.c: make the avail variable an atomic_long_t Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 078/105] dynamic-debug-howto: fix optional/omitted ending line number to be LARGE instead of 0 Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 079/105] NFS: Fix a typo in nfs_rename() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 080/105] sunrpc: Fix rpc_task_begin trace point Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 081/105] block: wake up all tasks blocked in get_request() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 082/105] sparc64/mm: set fields in deferred pages Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 083/105] sctp: do not free asoc when it is already dead in sctp_sendmsg Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 084/105] sctp: use the right sk after waking up from wait_buf sleep Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 085/105] atm: horizon: Fix irq release error Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 086/105] jump_label: Invoke jump_label_test() via early_initcall() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 087/105] xfrm: Copy policy family in clone_policy Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 088/105] IB/mlx4: Increase maximal message size under UD QP Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 089/105] IB/mlx5: Assign send CQ and recv CQ of UMR QP Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 090/105] afs: Connect up the CB.ProbeUuid Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 091/105] ipvlan: fix ipv6 outbound device Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 092/105] audit: ensure that audit=1 actually enables audit for PID 1 Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 093/105] ipmi: Stop timers before cleaning up the module Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 094/105] s390: always save and restore all registers on context switch Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 095/105] more bio_map_user_iov() leak fixes Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 096/105] tipc: fix memory leak in tipc_accept_from_sock() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 098/105] sit: update frag_off info Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 099/105] packet: fix crash in fanout_demux_rollover() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 100/105] net/packet: fix a race in packet_bind() and packet_notifier() Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 101/105] Revert "x86/efi: Build our own page table structures" Greg Kroah-Hartman
2017-12-15  9:45   ` Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 102/105] Revert "x86/efi: Hoist page table switching code into efi_call_virt()" Greg Kroah-Hartman
2017-12-15  9:45   ` Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 103/105] Revert "x86/mm/pat: Ensure cpa->pfn only contains page frame numbers" Greg Kroah-Hartman
2017-12-15  9:45   ` Greg Kroah-Hartman
2018-08-23  0:48   ` Roland Dreier
2018-08-23  6:12     ` Greg Kroah-Hartman
2018-08-23 16:37       ` Roland Dreier
2018-08-24 14:54         ` Matt Fleming
2018-08-24 16:45     ` Ben Hutchings
2018-08-24 17:08       ` Roland Dreier
2018-08-24 19:17         ` Greg Kroah-Hartman
2018-08-24 20:04           ` Roland Dreier
2018-08-24 20:10             ` Guenter Roeck
2018-08-24 20:16               ` Roland Dreier
2018-08-24 20:32                 ` Guenter Roeck
2018-08-31  6:24                   ` Guillaume Tucker
2018-08-31 16:02                     ` Greg Kroah-Hartman
2018-08-24 21:19             ` Guenter Roeck
2018-08-25 13:52             ` Guenter Roeck
2018-08-25 15:07               ` Greg Kroah-Hartman
2018-08-26  2:30                 ` Guenter Roeck
2018-08-29 19:58                   ` Roland Dreier
2018-08-30 12:10                     ` Greg Kroah-Hartman
2018-08-24 20:06           ` Guenter Roeck
2017-12-15  9:45 ` [PATCH 4.4 104/105] arm: KVM: Fix VTTBR_BADDR_MASK BUG_ON off-by-one Greg Kroah-Hartman
2017-12-15  9:45 ` [PATCH 4.4 105/105] usb: gadget: ffs: Forbid usb_ep_alloc_request from sleeping Greg Kroah-Hartman
2017-12-15 10:01 ` [PATCH 4.4 000/105] 4.4.106-stable review Nathan Chancellor
2017-12-15 10:01   ` Nathan Chancellor
2017-12-15 13:07   ` Greg Kroah-Hartman
2017-12-15 17:39 ` Guenter Roeck
2017-12-15 21:14 ` Shuah Khan
2017-12-16  5:36 ` Naresh Kamboju

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=20171215092306.666775396@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=dhowells@redhat.com \
    --cc=ebiggers@google.com \
    --cc=glider@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.