From: Sasha Levin <sashal@kernel.org>
To: patches@lists.linux.dev, stable@vger.kernel.org
Cc: Pengpeng Hou <pengpeng@iscas.ac.cn>,
Alex Deucher <alexander.deucher@amd.com>,
Sasha Levin <sashal@kernel.org>,
harry.wentland@amd.com, sunpeng.li@amd.com,
christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch,
amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org
Subject: [PATCH AUTOSEL 7.0-5.10] drm/amd/display: bios_parser: fix GPIO I2C line off-by-one
Date: Mon, 20 Apr 2026 09:18:17 -0400 [thread overview]
Message-ID: <20260420132314.1023554-103-sashal@kernel.org> (raw)
In-Reply-To: <20260420132314.1023554-1-sashal@kernel.org>
From: Pengpeng Hou <pengpeng@iscas.ac.cn>
[ Upstream commit 12fa1fd6dffff4eed15f1414eb7474127b2c5a24 ]
get_gpio_i2c_info() computes the number of GPIO I2C assignment records
present in the BIOS table and then uses bfI2C_LineMux as an array index
into header->asGPIO_Info[]. The current check only rejects values
strictly larger than the record count, so an index equal to count still
falls through and reaches the fixed table one element past the end.
Reject indices at or above the number of available records before using
them as an array index.
Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
LLM Generated explanations, may be completely bogus:
Now I have all the information needed. Let me compile the full analysis.
---
## PHASE 1: COMMIT MESSAGE FORENSICS
### Step 1.1: Subject Line
- **Subsystem**: drm/amd/display (AMD display driver, BIOS parser)
- **Action verb**: "fix" — explicitly a bug fix
- **Summary**: Fixes an off-by-one error in GPIO I2C line bounds
checking in the BIOS parser
### Step 1.2: Tags
- **Signed-off-by**: Pengpeng Hou <pengpeng@iscas.ac.cn> — the author
- **Signed-off-by**: Alex Deucher <alexander.deucher@amd.com> — AMD DRM
subsystem maintainer, merged the patch
- No Fixes: tag (expected for AUTOSEL candidates)
- No Reported-by, no Tested-by, no Reviewed-by
- No Cc: stable (expected)
### Step 1.3: Commit Body Analysis
The commit message clearly explains the bug mechanism:
- `get_gpio_i2c_info()` computes the number of GPIO I2C records in the
BIOS table
- `bfI2C_LineMux` is used as an array index into `header->asGPIO_Info[]`
- Current check rejects values **strictly larger** than record count,
but allows index **equal** to count
- Index equal to count accesses one element past the end (classic off-
by-one)
- **Symptom**: Out-of-bounds array read accessing uninitialized BIOS
data
### Step 1.4: Hidden Bug Fix?
No — this is explicitly labeled as a bug fix. The commit message clearly
describes the off-by-one mechanism.
Record: This is an explicitly stated off-by-one out-of-bounds array
access fix.
---
## PHASE 2: DIFF ANALYSIS
### Step 2.1: Change Inventory
- **Files changed**: 1
(`drivers/gpu/drm/amd/display/dc/bios/bios_parser.c`)
- **Lines changed**: 1 line modified (single character: `<` → `<=`)
- **Function modified**: `get_gpio_i2c_info()`
- **Scope**: Single-file, single-character surgical fix
### Step 2.2: Code Flow Change
```1957:1957:drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
if (count < record->sucI2cId.bfI2C_LineMux)
```
**Before**: `count < bfI2C_LineMux` — rejects only when index > count.
When index == count, the check passes but the access at
`header->asGPIO_Info[count]` is one past the last valid entry (valid
indices are 0..count-1).
**After**: `count <= bfI2C_LineMux` — rejects when index >= count,
correctly limiting access to indices 0..count-1.
### Step 2.3: Bug Mechanism
**Category**: Buffer overflow / out-of-bounds read (off-by-one)
The `asGPIO_Info` array has `ATOM_MAX_SUPPORTED_DEVICE` (16) elements in
the struct definition, but `count` is computed from the BIOS table's
reported structure size and represents how many entries the BIOS
actually initialized. Reading at index `count` accesses either:
- Uninitialized BIOS data within the struct, OR
- Beyond the actual BIOS table data (if the table is exactly sized)
The result is used to populate `info->gpio_info.*` fields including
register indices and shift values, which are then used for actual
hardware register access. Reading garbage values could lead to incorrect
register reads/writes.
### Step 2.4: Fix Quality
- **Obviously correct**: Yes — textbook off-by-one fix. Array of `count`
elements, valid indices 0..count-1, must reject index >= count.
- **Minimal**: Maximally minimal — single character change.
- **Regression risk**: Essentially zero — the fix only tightens a bounds
check. The only behavioral change is rejecting the boundary case that
was previously allowed (and was incorrect).
---
## PHASE 3: GIT HISTORY INVESTIGATION
### Step 3.1: Blame
All lines in the affected function trace back to commit `4562236b3bc0a2`
("drm/amd/dc: Add dc display driver (v2)") by Harry Wentland, dated
2017-09-12. This is the **initial import** of the AMD DC display driver.
The bug has been present since **v4.15** — it exists in ALL stable trees
that contain this driver.
### Step 3.2: No Fixes: tag present (expected)
The implicit Fixes: target is `4562236b3bc0a2` — the initial driver
import.
### Step 3.3: File History
Recent file changes are mostly feature additions (DAC/encoder support,
logging changes) and treewide cleanups. None touch the
`get_gpio_i2c_info()` function — this code has been stable/unchanged
since 2017.
### Step 3.4: Author
Pengpeng Hou has multiple commits in the tree, all small bounds-checking
fixes (NFC, networking, Bluetooth, tracing). This is consistent — the
author appears to systematically audit bounds checking across the
kernel.
### Step 3.5: Dependencies
None. This is a completely standalone one-character fix with no
prerequisites.
---
## PHASE 4: MAILING LIST AND EXTERNAL RESEARCH
### Step 4.1-4.2: Patch Discussion
b4 dig could not find the original submission (likely too recent or
submitted through AMD's drm tree). The patch was signed off by Alex
Deucher, the AMD DRM subsystem maintainer, indicating it passed review
through the normal AMD DRM merge path.
### Step 4.3: Related Fixes
Web search found historical AUTOSEL patches for BIOS parser OOB issues
(`4fc1ba4aa589` by Aurabindo Pillai, `d116db180decec1b` by Mario
Limonciello), but those addressed a **different** issue — `gpio_pin`
array hardcoded to size 8 in bios_parser2.c/atomfirmware.h. The current
fix is for bios_parser.c (v1 parser) and a different bounds check.
### Step 4.4-4.5: No stable-specific discussion found for this exact
fix.
---
## PHASE 5: CODE SEMANTIC ANALYSIS
### Step 5.1-5.2: Call Chain
- `get_gpio_i2c_info()` is called from `bios_parser_get_i2c_info()`
- This is registered as the `.get_i2c_info` callback in the BIOS parser
vtable
- Callers:
1. `dce_i2c.c` line 45: `dcb->funcs->get_i2c_info(dcb, id, &i2c_info)`
— OEM I2C setup
2. `link_ddc.c` line 123: `dcb->funcs->get_i2c_info(dcb,
init_data->id, &i2c_info)` — DDC (Display Data Channel)
initialization for monitor connections
### Step 5.3-5.4: Impact Surface
Both callers are in the display initialization path:
- `link_ddc.c` is called during DDC service creation, which happens for
**every display output** during driver initialization
- `dce_i2c.c` is called for OEM I2C device setup
- These paths are triggered during boot/display setup on ALL AMD GPU
systems using the older BIOS parser (pre-ATOM v2 firmware)
### Step 5.5: Similar Patterns
The parallel `bios_parser2.c` (for newer GPUs) uses a different approach
— iterating with `for (table_index = 0; table_index < count;
table_index++)` — which correctly bounds the access. Only bios_parser.c
(v1) has this off-by-one bug.
---
## PHASE 6: STABLE TREE ANALYSIS
### Step 6.1: Code Exists in Stable Trees
The buggy code was introduced in `4562236b3bc0a2` ("drm/amd/dc: Add dc
display driver (v2)") merged in v4.15 (2017). This code exists in
**ALL** active stable trees (5.4, 5.10, 5.15, 6.1, 6.6, 6.12, 7.0,
etc.).
### Step 6.2: Backport Complications
The function has been **unchanged since 2017**. The fix will apply
cleanly to all stable trees without modification.
### Step 6.3: No related fixes already in stable for this specific
issue.
---
## PHASE 7: SUBSYSTEM AND MAINTAINER CONTEXT
### Step 7.1: Subsystem
- **Path**: drivers/gpu/drm/amd/display — AMD GPU display driver
- **Criticality**: IMPORTANT — AMD GPUs are extremely common in
desktops, laptops, and servers
- Signed off by subsystem maintainer (Alex Deucher)
### Step 7.2: Subsystem Activity
Actively developed with regular changes. The bios_parser.c file itself
is relatively stable since it handles older BIOS formats.
---
## PHASE 8: IMPACT AND RISK ASSESSMENT
### Step 8.1: Affected Users
All users with AMD GPUs that use the older ATOM v1 BIOS format (pre-Vega
GPUs: Polaris, older GCN). This includes a significant installed base.
### Step 8.2: Trigger Conditions
The bug triggers when the BIOS table has a `bfI2C_LineMux` value equal
to the computed record count. This depends on the specific GPU's
BIOS/VBIOS contents. While not every GPU will trigger this (it requires
a specific boundary condition in the BIOS table), it's entirely
firmware-determined and can't be worked around by users.
### Step 8.3: Failure Mode
When triggered: reads uninitialized/garbage BIOS data for register
indices and shift values, which are then used for hardware register
access. This could cause:
- Incorrect GPIO/I2C configuration → display initialization failure
- Reads of wrong hardware registers → unpredictable behavior
- **Severity**: HIGH (incorrect hardware register access from garbage
data)
### Step 8.4: Risk-Benefit
- **Benefit**: HIGH — prevents out-of-bounds access in display
initialization path used by all AMD GPUs with older BIOS format
- **Risk**: VERY LOW — single character change that only tightens a
bounds check. Cannot introduce regressions.
- **Ratio**: Overwhelmingly favorable
---
## PHASE 9: FINAL SYNTHESIS
### Step 9.1: Evidence Summary
**FOR backporting:**
- Classic off-by-one out-of-bounds array access — a real bug
- Single character change (`<` → `<=`) — maximally minimal
- Obviously correct — trivially verifiable by reading the code
- Bug exists since v4.15 (2017) — affects all stable trees
- Code is completely unchanged since introduction — will apply cleanly
everywhere
- Signed off by subsystem maintainer (Alex Deucher)
- Prevents access to uninitialized data used for hardware register
operations
- No dependencies, completely standalone
**AGAINST backporting:**
- No reported user incidents (but the bug depends on specific BIOS table
values)
- No Fixes: tag or syzbot report (expected for AUTOSEL candidates)
### Step 9.2: Stable Rules Checklist
1. **Obviously correct and tested?** YES — trivially verifiable, signed
off by maintainer
2. **Fixes a real bug?** YES — out-of-bounds array access
3. **Important issue?** YES — OOB access leading to incorrect hardware
register operations
4. **Small and contained?** YES — 1 character change in 1 file
5. **No new features/APIs?** Correct — pure bug fix
6. **Can apply to stable?** YES — code unchanged since v4.15, will apply
cleanly
### Step 9.3: Exception Categories
Not needed — this clearly meets standard stable criteria as a bug fix.
---
## Verification
- [Phase 1] Parsed tags: Signed-off-by Alex Deucher (AMD DRM
maintainer), author Pengpeng Hou
- [Phase 2] Diff analysis: Single character change `<` to `<=` in bounds
check at line 1957 of bios_parser.c
- [Phase 2] Verified the OOB: `count` = number of valid records
(0-indexed), old check passes when index == count, which is one past
last valid entry
- [Phase 3] git blame: All code in affected function from commit
4562236b3bc0a2 (Harry Wentland, 2017-09-12, v4.15 initial driver
import)
- [Phase 3] git log: Function unchanged since 2017, no intermediate
fixes for same issue
- [Phase 3] Author: Pengpeng Hou has 10+ similar bounds-checking fixes
in tree (NFC, net, BT, tracing)
- [Phase 5] Callers: `get_gpio_i2c_info()` called via `.get_i2c_info`
vtable from link_ddc.c (DDC init) and dce_i2c.c (OEM I2C) — display
initialization paths
- [Phase 5] Verified bios_parser2.c uses `for (table_index = 0;
table_index < count; ...)` — different approach, not affected
- [Phase 5] Verified ATOM_GPIO_I2C_INFO struct:
`asGPIO_Info[ATOM_MAX_SUPPORTED_DEVICE]` with
ATOM_MAX_SUPPORTED_DEVICE=16
- [Phase 6] Code exists unchanged in all stable trees since v4.15 —
clean apply guaranteed
- [Phase 7] AMD GPU display driver — IMPORTANT subsystem, widely used
hardware
- [Phase 8] Failure mode: garbage register indices/shifts used for
hardware access — HIGH severity
- UNVERIFIED: Could not find original mailing list discussion (lore
blocked by bot protection, b4 dig found nothing). This does not affect
the decision — the fix is technically obvious.
---
This is a textbook stable backport candidate: a single-character fix for
an off-by-one out-of-bounds array access that has existed since the
driver was introduced in v4.15. The fix is maximally minimal, obviously
correct, signed off by the subsystem maintainer, applies cleanly to all
stable trees, and has zero regression risk.
**YES**
drivers/gpu/drm/amd/display/dc/bios/bios_parser.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
index 73e3c45eeeba6..2c9cf00b22745 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -1954,7 +1954,7 @@ static enum bp_result get_gpio_i2c_info(struct bios_parser *bp,
count = (le16_to_cpu(header->sHeader.usStructureSize)
- sizeof(ATOM_COMMON_TABLE_HEADER))
/ sizeof(ATOM_GPIO_I2C_ASSIGMENT);
- if (count < record->sucI2cId.bfI2C_LineMux)
+ if (count <= record->sucI2cId.bfI2C_LineMux)
return BP_RESULT_BADBIOSTABLE;
/* get the GPIO_I2C_INFO */
--
2.53.0
next prev parent reply other threads:[~2026-04-20 13:26 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20260420132314.1023554-1-sashal@kernel.org>
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.12] drm/amdgpu: fix DF NULL pointer issue for soc24 Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.18] drm/ttm: Avoid invoking the OOM killer when reading back swapped content Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 6.18] drm/vc4: Release runtime PM reference after binding V3D Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.19] drm/xe/vf: Wait for all fixups before using default LRCs Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: remove duplicate format modifier Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: unlock cancel_delayed_work_sync for hang_detect_work Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0-6.1] drm/amd/display: Merge pipes for validate Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/xe: Fix bug in idledly unit conversion Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0] drm/xe: Skip adding PRL entry to NULL VMA Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/vc4: Fix a memory leak in hang state error path Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/vc4: Protect madv read in vc4_gem_object_mmap() with madv_lock Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Fix cursor pos at overlay plane edges on DCN4 Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.1] drm/msm/dpu: fix vblank IRQ registration before atomic_mode_set Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 6.18] drm/amdgpu: Handle GPU page faults correctly on non-4K page systems Sasha Levin
2026-04-20 13:18 ` Sasha Levin [this message]
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Handle IH v7_1 reg offset differences Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu/vcn4.0.3: gate per-queue reset by PSP SOS program version Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/imx: parallel-display: add DRM_DISPLAY_HELPER for DRM_IMX_PARALLEL_DISPLAY Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix amdgpu_userq_evict Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-5.10] drm/amdgpu: validate fence_count in wait_fences ioctl Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.6] drm/amdgpu: fix shift-out-of-bounds when updating umc active mask Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: remove queue from doorbell xa during clean up Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdkfd: fix kernel crash on releasing NULL sysfs entry Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/xe/guc: Add Wa_14025883347 for GuC DMA failure on reset Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: clear related counter after RAS eeprom reset Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Restore full update for tiling change to linear Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0] drm/amdgpu: fix array out of bounds accesses for mes sw_fini Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Exit IPS w/ DC helper for all dc_set_power_state cases Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix syncobj leak for amdgpu_gem_va_ioctl() Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: Check for multiplication overflow in checkpoint stack size Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/prime: Limit scatter list size with dedicated DMA device Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Clamp dc_cursor_position x_hotspot to prevent integer overflow Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: defer queue publication until create completes Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu/userq: fix dma_fence refcount underflow in userq path Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.12] drm/amdgpu: guard atom_context in devcoredump VBIOS dump Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.18] drm/amd/display: Avoid turning off the PHY when OTG is running for DVI Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Revert setting up Retry based Thrashing on GFX 12.1 Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amd/pm: Avoid overflow when sorting pp_feature list Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Fix number of opp Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/panel-edp: Change BOE NV140WUM-N64 timings Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amd/display: Fix HWSS v3 fast path determination Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-5.10] drm/mediatek: mtk_dsi: enable hs clock during pre-enable Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 6.18] drm/vc4: Fix memory leak of BO array in hang state Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Remove invalid DPSTREAMCLK mask usage Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/panel-edp: Add CMN N116BCL-EAK (C2) Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Add default reset method for soc_v1_0 Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: cleanup amdgpu_userq_get/put where not needed Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix some more bug in amdgpu_gem_va_ioctl Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-5.10] fbdev: omap2: fix inconsistent lock returns in omapfb_mmap Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm: gpu: msm: forbid mem reclaim from reset Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/panel-edp: Add AUO B116XAT04.1 (HW: 1A) Sasha Levin
2026-04-20 13:22 ` [PATCH AUTOSEL 7.0-6.6] drm/gem-dma: set VM_DONTDUMP for mmap Sasha Levin
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=20260420132314.1023554-103-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=pengpeng@iscas.ac.cn \
--cc=simona@ffwll.ch \
--cc=stable@vger.kernel.org \
--cc=sunpeng.li@amd.com \
/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