From: Dan Carpenter <dan.carpenter@linaro.org>
To: oe-kbuild@lists.linux.dev, fdmanana@kernel.org,
linux-btrfs@vger.kernel.org
Cc: lkp@intel.com, oe-kbuild-all@lists.linux.dev
Subject: Re: [PATCH 33/33] btrfs: dump detailed info and specific messages on log replay failures
Date: Sun, 7 Sep 2025 14:25:19 +0300 [thread overview]
Message-ID: <202509070931.zy8HHIta-lkp@intel.com> (raw)
In-Reply-To: <f0623e4f3a69cd61238551c1e5b44fc31077db16.1757075118.git.fdmanana@suse.com>
Hi,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/fdmanana-kernel-org/btrfs-fix-invalid-extref-key-setup-when-replaying-dentry/20250906-001715
base: https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/r/f0623e4f3a69cd61238551c1e5b44fc31077db16.1757075118.git.fdmanana%40suse.com
patch subject: [PATCH 33/33] btrfs: dump detailed info and specific messages on log replay failures
config: i386-randconfig-141-20250906 (https://download.01.org/0day-ci/archive/20250907/202509070931.zy8HHIta-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202509070931.zy8HHIta-lkp@intel.com/
New smatch warnings:
fs/btrfs/tree-log.c:2591 replay_xattr_deletes() warn: passing freed memory 'name' (line 2588)
Old smatch warnings:
fs/btrfs/tree-log.c:2601 replay_xattr_deletes() warn: passing freed memory 'name' (line 2588)
fs/btrfs/tree-log.c:2614 replay_xattr_deletes() warn: passing freed memory 'name' (line 2611)
vim +/name +2591 fs/btrfs/tree-log.c
51abc774a9b1d4 Filipe Manana 2025-09-05 2517 static int replay_xattr_deletes(struct walk_control *wc)
4f764e5153616f Filipe Manana 2015-02-23 2518 {
b75ff3e7b377e8 Filipe Manana 2025-09-05 2519 struct btrfs_trans_handle *trans = wc->trans;
b75ff3e7b377e8 Filipe Manana 2025-09-05 2520 struct btrfs_root *root = wc->root;
b75ff3e7b377e8 Filipe Manana 2025-09-05 2521 struct btrfs_root *log = wc->log;
4f764e5153616f Filipe Manana 2015-02-23 2522 struct btrfs_key search_key;
4f764e5153616f Filipe Manana 2015-02-23 2523 struct btrfs_path *log_path;
b048ef711534b2 Filipe Manana 2025-09-05 2524 const u64 ino = wc->log_key.objectid;
4f764e5153616f Filipe Manana 2015-02-23 2525 int nritems;
4f764e5153616f Filipe Manana 2015-02-23 2526 int ret;
4f764e5153616f Filipe Manana 2015-02-23 2527
4f764e5153616f Filipe Manana 2015-02-23 2528 log_path = btrfs_alloc_path();
fa7c5927bfe412 Filipe Manana 2025-07-18 2529 if (!log_path) {
c2bd309cef030f Filipe Manana 2025-09-05 2530 btrfs_abort_log_replay(wc, -ENOMEM, "failed to allocate path");
4f764e5153616f Filipe Manana 2015-02-23 2531 return -ENOMEM;
fa7c5927bfe412 Filipe Manana 2025-07-18 2532 }
4f764e5153616f Filipe Manana 2015-02-23 2533
4f764e5153616f Filipe Manana 2015-02-23 2534 search_key.objectid = ino;
4f764e5153616f Filipe Manana 2015-02-23 2535 search_key.type = BTRFS_XATTR_ITEM_KEY;
4f764e5153616f Filipe Manana 2015-02-23 2536 search_key.offset = 0;
4f764e5153616f Filipe Manana 2015-02-23 2537 again:
51abc774a9b1d4 Filipe Manana 2025-09-05 2538 ret = btrfs_search_slot(NULL, root, &search_key, wc->subvol_path, 0, 0);
fa7c5927bfe412 Filipe Manana 2025-07-18 2539 if (ret < 0) {
c2bd309cef030f Filipe Manana 2025-09-05 2540 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2541 "failed to search xattrs for inode %llu root %llu",
c2bd309cef030f Filipe Manana 2025-09-05 2542 ino, btrfs_root_id(root));
4f764e5153616f Filipe Manana 2015-02-23 2543 goto out;
fa7c5927bfe412 Filipe Manana 2025-07-18 2544 }
4f764e5153616f Filipe Manana 2015-02-23 2545 process_leaf:
51abc774a9b1d4 Filipe Manana 2025-09-05 2546 nritems = btrfs_header_nritems(wc->subvol_path->nodes[0]);
51abc774a9b1d4 Filipe Manana 2025-09-05 2547 for (int i = wc->subvol_path->slots[0]; i < nritems; i++) {
4f764e5153616f Filipe Manana 2015-02-23 2548 struct btrfs_key key;
4f764e5153616f Filipe Manana 2015-02-23 2549 struct btrfs_dir_item *di;
4f764e5153616f Filipe Manana 2015-02-23 2550 struct btrfs_dir_item *log_di;
4f764e5153616f Filipe Manana 2015-02-23 2551 u32 total_size;
4f764e5153616f Filipe Manana 2015-02-23 2552 u32 cur;
4f764e5153616f Filipe Manana 2015-02-23 2553
51abc774a9b1d4 Filipe Manana 2025-09-05 2554 btrfs_item_key_to_cpu(wc->subvol_path->nodes[0], &key, i);
4f764e5153616f Filipe Manana 2015-02-23 2555 if (key.objectid != ino || key.type != BTRFS_XATTR_ITEM_KEY) {
4f764e5153616f Filipe Manana 2015-02-23 2556 ret = 0;
4f764e5153616f Filipe Manana 2015-02-23 2557 goto out;
4f764e5153616f Filipe Manana 2015-02-23 2558 }
4f764e5153616f Filipe Manana 2015-02-23 2559
51abc774a9b1d4 Filipe Manana 2025-09-05 2560 di = btrfs_item_ptr(wc->subvol_path->nodes[0], i, struct btrfs_dir_item);
51abc774a9b1d4 Filipe Manana 2025-09-05 2561 total_size = btrfs_item_size(wc->subvol_path->nodes[0], i);
4f764e5153616f Filipe Manana 2015-02-23 2562 cur = 0;
4f764e5153616f Filipe Manana 2015-02-23 2563 while (cur < total_size) {
51abc774a9b1d4 Filipe Manana 2025-09-05 2564 u16 name_len = btrfs_dir_name_len(wc->subvol_path->nodes[0], di);
51abc774a9b1d4 Filipe Manana 2025-09-05 2565 u16 data_len = btrfs_dir_data_len(wc->subvol_path->nodes[0], di);
4f764e5153616f Filipe Manana 2015-02-23 2566 u32 this_len = sizeof(*di) + name_len + data_len;
4f764e5153616f Filipe Manana 2015-02-23 2567 char *name;
4f764e5153616f Filipe Manana 2015-02-23 2568
4f764e5153616f Filipe Manana 2015-02-23 2569 name = kmalloc(name_len, GFP_NOFS);
4f764e5153616f Filipe Manana 2015-02-23 2570 if (!name) {
4f764e5153616f Filipe Manana 2015-02-23 2571 ret = -ENOMEM;
c2bd309cef030f Filipe Manana 2025-09-05 2572 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2573 "failed to allocate memory for name of length %u",
c2bd309cef030f Filipe Manana 2025-09-05 2574 name_len);
4f764e5153616f Filipe Manana 2015-02-23 2575 goto out;
4f764e5153616f Filipe Manana 2015-02-23 2576 }
51abc774a9b1d4 Filipe Manana 2025-09-05 2577 read_extent_buffer(wc->subvol_path->nodes[0], name,
4f764e5153616f Filipe Manana 2015-02-23 2578 (unsigned long)(di + 1), name_len);
4f764e5153616f Filipe Manana 2015-02-23 2579
4f764e5153616f Filipe Manana 2015-02-23 2580 log_di = btrfs_lookup_xattr(NULL, log, log_path, ino,
4f764e5153616f Filipe Manana 2015-02-23 2581 name, name_len, 0);
4f764e5153616f Filipe Manana 2015-02-23 2582 btrfs_release_path(log_path);
4f764e5153616f Filipe Manana 2015-02-23 2583 if (!log_di) {
4f764e5153616f Filipe Manana 2015-02-23 2584 /* Doesn't exist in log tree, so delete it. */
51abc774a9b1d4 Filipe Manana 2025-09-05 2585 btrfs_release_path(wc->subvol_path);
51abc774a9b1d4 Filipe Manana 2025-09-05 2586 di = btrfs_lookup_xattr(trans, root, wc->subvol_path, ino,
4f764e5153616f Filipe Manana 2015-02-23 2587 name, name_len, -1);
4f764e5153616f Filipe Manana 2015-02-23 @2588 kfree(name);
^^^^
kfree()
4f764e5153616f Filipe Manana 2015-02-23 2589 if (IS_ERR(di)) {
4f764e5153616f Filipe Manana 2015-02-23 2590 ret = PTR_ERR(di);
c2bd309cef030f Filipe Manana 2025-09-05 @2591 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2592 "failed to lookup xattr with name %.*s for inode %llu root %llu",
c2bd309cef030f Filipe Manana 2025-09-05 2593 name_len, name, ino,
^^^^
Use after free
c2bd309cef030f Filipe Manana 2025-09-05 2594 btrfs_root_id(root));
4f764e5153616f Filipe Manana 2015-02-23 2595 goto out;
4f764e5153616f Filipe Manana 2015-02-23 2596 }
4f764e5153616f Filipe Manana 2015-02-23 2597 ASSERT(di);
4f764e5153616f Filipe Manana 2015-02-23 2598 ret = btrfs_delete_one_dir_name(trans, root,
51abc774a9b1d4 Filipe Manana 2025-09-05 2599 wc->subvol_path, di);
fa7c5927bfe412 Filipe Manana 2025-07-18 2600 if (ret) {
c2bd309cef030f Filipe Manana 2025-09-05 2601 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2602 "failed to delete xattr with name %.*s for inode %llu root %llu",
c2bd309cef030f Filipe Manana 2025-09-05 2603 name_len, name, ino,
^^^^
First print the name, then free it.
c2bd309cef030f Filipe Manana 2025-09-05 2604 btrfs_root_id(root));
4f764e5153616f Filipe Manana 2015-02-23 2605 goto out;
fa7c5927bfe412 Filipe Manana 2025-07-18 2606 }
51abc774a9b1d4 Filipe Manana 2025-09-05 2607 btrfs_release_path(wc->subvol_path);
4f764e5153616f Filipe Manana 2015-02-23 2608 search_key = key;
4f764e5153616f Filipe Manana 2015-02-23 2609 goto again;
4f764e5153616f Filipe Manana 2015-02-23 2610 }
4f764e5153616f Filipe Manana 2015-02-23 2611 kfree(name);
^^^^^
4f764e5153616f Filipe Manana 2015-02-23 2612 if (IS_ERR(log_di)) {
4f764e5153616f Filipe Manana 2015-02-23 2613 ret = PTR_ERR(log_di);
c2bd309cef030f Filipe Manana 2025-09-05 2614 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2615 "failed to lookup xattr in log tree with name %.*s for inode %llu root %llu",
c2bd309cef030f Filipe Manana 2025-09-05 2616 name_len, name, ino,
^^^^
same.
c2bd309cef030f Filipe Manana 2025-09-05 2617 btrfs_root_id(root));
4f764e5153616f Filipe Manana 2015-02-23 2618 goto out;
4f764e5153616f Filipe Manana 2015-02-23 2619 }
4f764e5153616f Filipe Manana 2015-02-23 2620 cur += this_len;
4f764e5153616f Filipe Manana 2015-02-23 2621 di = (struct btrfs_dir_item *)((char *)di + this_len);
4f764e5153616f Filipe Manana 2015-02-23 2622 }
4f764e5153616f Filipe Manana 2015-02-23 2623 }
51abc774a9b1d4 Filipe Manana 2025-09-05 2624 ret = btrfs_next_leaf(root, wc->subvol_path);
4f764e5153616f Filipe Manana 2015-02-23 2625 if (ret > 0)
4f764e5153616f Filipe Manana 2015-02-23 2626 ret = 0;
4f764e5153616f Filipe Manana 2015-02-23 2627 else if (ret == 0)
4f764e5153616f Filipe Manana 2015-02-23 2628 goto process_leaf;
fa7c5927bfe412 Filipe Manana 2025-07-18 2629 else
c2bd309cef030f Filipe Manana 2025-09-05 2630 btrfs_abort_log_replay(wc, ret,
c2bd309cef030f Filipe Manana 2025-09-05 2631 "failed to get next leaf in subvolume root %llu",
c2bd309cef030f Filipe Manana 2025-09-05 2632 btrfs_root_id(root));
4f764e5153616f Filipe Manana 2015-02-23 2633 out:
4f764e5153616f Filipe Manana 2015-02-23 2634 btrfs_free_path(log_path);
51abc774a9b1d4 Filipe Manana 2025-09-05 2635 btrfs_release_path(wc->subvol_path);
4f764e5153616f Filipe Manana 2015-02-23 2636 return ret;
4f764e5153616f Filipe Manana 2015-02-23 2637 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2025-09-07 11:25 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-05 16:09 [PATCH 00/33] btrfs: log replay bug fix, cleanups and error reporting changes fdmanana
2025-09-05 16:09 ` [PATCH 01/33] btrfs: fix invalid extref key setup when replaying dentry fdmanana
2025-09-05 16:09 ` [PATCH 02/33] btrfs: use booleans in walk control structure for log replay fdmanana
2025-09-05 16:09 ` [PATCH 03/33] btrfs: rename replay_dest member of struct walk_control to root fdmanana
2025-09-05 16:09 ` [PATCH 04/33] btrfs: rename root to log in walk_down_log_tree() and walk_up_log_tree() fdmanana
2025-09-05 16:09 ` [PATCH 05/33] btrfs: add and use a log root field to struct walk_control fdmanana
2025-09-05 16:09 ` [PATCH 06/33] btrfs: deduplicate log root free in error paths from btrfs_recover_log_trees() fdmanana
2025-09-05 16:09 ` [PATCH 07/33] btrfs: stop passing transaction parameter to log tree walk functions fdmanana
2025-09-05 16:09 ` [PATCH 08/33] btrfs: stop setting log_root_tree->log_root to NULL in btrfs_recover_log_trees() fdmanana
2025-09-05 16:09 ` [PATCH 09/33] btrfs: always drop log root tree reference in btrfs_replay_log() fdmanana
2025-09-05 16:09 ` [PATCH 10/33] btrfs: pass walk_control structure to replay_xattr_deletes() fdmanana
2025-09-05 16:09 ` [PATCH 11/33] btrfs: move up the definition of struct walk_control fdmanana
2025-09-05 16:10 ` [PATCH 12/33] btrfs: pass walk_control structure to replay_dir_deletes() fdmanana
2025-09-05 16:10 ` [PATCH 13/33] btrfs: pass walk_control structure to check_item_in_log() fdmanana
2025-09-05 16:10 ` [PATCH 14/33] btrfs: pass walk_control structure to replay_one_extent() fdmanana
2025-09-05 16:10 ` [PATCH 15/33] btrfs: pass walk_control structure to add_inode_ref() and helpers fdmanana
2025-09-05 16:10 ` [PATCH 16/33] btrfs: pass walk_control structure to replay_one_dir_item() and replay_one_name() fdmanana
2025-09-05 16:10 ` [PATCH 17/33] btrfs: pass walk_control structure to drop_one_dir_item() and helpers fdmanana
2025-09-05 16:10 ` [PATCH 18/33] btrfs: pass walk_control structure to replay_one_extent() fdmanana
2025-09-05 16:10 ` [PATCH 19/33] btrfs: use level argument in log tree walk callback process_one_buffer() fdmanana
2025-09-05 16:10 ` [PATCH 20/33] btrfs: use level argument in log tree walk callback replay_one_buffer() fdmanana
2025-09-05 16:10 ` [PATCH 21/33] btrfs: use the inode item boolean everywhere in overwrite_item() fdmanana
2025-09-05 16:10 ` [PATCH 22/33] btrfs: add current log leaf, key and slot to struct walk_control fdmanana
2025-09-05 16:10 ` [PATCH 23/33] btrfs: avoid unnecessary path allocation at fixup_inode_link_count() fdmanana
2025-09-05 16:10 ` [PATCH 24/33] btrfs: avoid path allocations when dropping extents during log replay fdmanana
2025-09-05 16:10 ` [PATCH 25/33] btrfs: avoid unnecessary path allocation when replaying a dir item fdmanana
2025-09-05 16:10 ` [PATCH 26/33] btrfs: remove redundant path release when processing dentry during log replay fdmanana
2025-09-05 16:10 ` [PATCH 27/33] btrfs: remove redundant path release when overwriting item " fdmanana
2025-09-05 16:10 ` [PATCH 28/33] btrfs: add path for subvolume tree changes to struct walk_control fdmanana
2025-09-05 16:10 ` [PATCH 29/33] btrfs: stop passing inode object IDs to __add_inode_ref() in log replay fdmanana
2025-09-05 16:10 ` [PATCH 30/33] btrfs: remove pointless inode lookup when processing extrefs during " fdmanana
2025-09-05 16:10 ` [PATCH 31/33] btrfs: abort transaction if we fail to find dir item " fdmanana
2025-09-05 16:10 ` [PATCH 32/33] btrfs: abort transaction if we fail to update inode in log replay dir fixup fdmanana
2025-09-05 16:10 ` [PATCH 33/33] btrfs: dump detailed info and specific messages on log replay failures fdmanana
2025-09-07 11:25 ` Dan Carpenter [this message]
2025-09-08 9:52 ` [PATCH v2 00/33] btrfs: log replay bug fix, cleanups and error reporting changes fdmanana
2025-09-08 9:52 ` [PATCH v2 01/33] btrfs: fix invalid extref key setup when replaying dentry fdmanana
2025-09-08 9:52 ` [PATCH v2 02/33] btrfs: use booleans in walk control structure for log replay fdmanana
2025-09-08 9:52 ` [PATCH v2 03/33] btrfs: rename replay_dest member of struct walk_control to root fdmanana
2025-09-08 9:52 ` [PATCH v2 04/33] btrfs: rename root to log in walk_down_log_tree() and walk_up_log_tree() fdmanana
2025-09-08 9:52 ` [PATCH v2 05/33] btrfs: add and use a log root field to struct walk_control fdmanana
2025-09-08 9:53 ` [PATCH v2 06/33] btrfs: deduplicate log root free in error paths from btrfs_recover_log_trees() fdmanana
2025-09-08 9:53 ` [PATCH v2 07/33] btrfs: stop passing transaction parameter to log tree walk functions fdmanana
2025-09-08 9:53 ` [PATCH v2 08/33] btrfs: stop setting log_root_tree->log_root to NULL in btrfs_recover_log_trees() fdmanana
2025-09-08 9:53 ` [PATCH v2 09/33] btrfs: always drop log root tree reference in btrfs_replay_log() fdmanana
2025-09-08 9:53 ` [PATCH v2 10/33] btrfs: pass walk_control structure to replay_xattr_deletes() fdmanana
2025-09-08 9:53 ` [PATCH v2 11/33] btrfs: move up the definition of struct walk_control fdmanana
2025-09-08 9:53 ` [PATCH v2 12/33] btrfs: pass walk_control structure to replay_dir_deletes() fdmanana
2025-09-08 9:53 ` [PATCH v2 13/33] btrfs: pass walk_control structure to check_item_in_log() fdmanana
2025-09-08 9:53 ` [PATCH v2 14/33] btrfs: pass walk_control structure to replay_one_extent() fdmanana
2025-09-08 9:53 ` [PATCH v2 15/33] btrfs: pass walk_control structure to add_inode_ref() and helpers fdmanana
2025-09-08 9:53 ` [PATCH v2 16/33] btrfs: pass walk_control structure to replay_one_dir_item() and replay_one_name() fdmanana
2025-09-08 9:53 ` [PATCH v2 17/33] btrfs: pass walk_control structure to drop_one_dir_item() and helpers fdmanana
2025-09-08 9:53 ` [PATCH v2 18/33] btrfs: pass walk_control structure to overwrite_item() fdmanana
2025-09-08 9:53 ` [PATCH v2 19/33] btrfs: use level argument in log tree walk callback process_one_buffer() fdmanana
2025-09-08 9:53 ` [PATCH v2 20/33] btrfs: use level argument in log tree walk callback replay_one_buffer() fdmanana
2025-09-08 9:53 ` [PATCH v2 21/33] btrfs: use the inode item boolean everywhere in overwrite_item() fdmanana
2025-09-08 9:53 ` [PATCH v2 22/33] btrfs: add current log leaf, key and slot to struct walk_control fdmanana
2025-09-08 9:53 ` [PATCH v2 23/33] btrfs: avoid unnecessary path allocation at fixup_inode_link_count() fdmanana
2025-09-08 9:53 ` [PATCH v2 24/33] btrfs: avoid path allocations when dropping extents during log replay fdmanana
2025-09-08 9:53 ` [PATCH v2 25/33] btrfs: avoid unnecessary path allocation when replaying a dir item fdmanana
2025-09-08 9:53 ` [PATCH v2 26/33] btrfs: remove redundant path release when processing dentry during log replay fdmanana
2025-09-08 9:53 ` [PATCH v2 27/33] btrfs: remove redundant path release when overwriting item " fdmanana
2025-09-08 9:53 ` [PATCH v2 28/33] btrfs: add path for subvolume tree changes to struct walk_control fdmanana
2025-09-08 9:53 ` [PATCH v2 29/33] btrfs: stop passing inode object IDs to __add_inode_ref() in log replay fdmanana
2025-09-08 9:53 ` [PATCH v2 30/33] btrfs: remove pointless inode lookup when processing extrefs during " fdmanana
2025-09-08 9:53 ` [PATCH v2 31/33] btrfs: abort transaction if we fail to find dir item " fdmanana
2025-09-08 9:53 ` [PATCH v2 32/33] btrfs: abort transaction if we fail to update inode in log replay dir fixup fdmanana
2025-09-08 9:53 ` [PATCH v2 33/33] btrfs: dump detailed info and specific messages on log replay failures fdmanana
2025-09-09 0:53 ` David Sterba
2025-09-09 14:42 ` Filipe Manana
2025-09-09 0:55 ` [PATCH v2 00/33] btrfs: log replay bug fix, cleanups and error reporting changes David Sterba
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=202509070931.zy8HHIta-lkp@intel.com \
--to=dan.carpenter@linaro.org \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=lkp@intel.com \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=oe-kbuild@lists.linux.dev \
/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