Subject: [REGRESSION] uninitialized value $address in git send-email when given multiple recipients separated by commas

From: Bagas Sanjaya <[email-masked]>
Date: Fri, 22 Sep 2023 16:27:55 +0700

Hi,

This regression is similar to one I reported earlier [1], with the same
error message but with slightly different reproducer (and as continuation
to the former report).

I use git-send-email(1) to submit patches (occasional doc fixes) to LKML.
Rather than having to type multiple --to/--cc addresses, I use the undocumented
behavior of listing multiple addresses separated by comma in a single --to/--cc
option. i.e.:

```
$ git send-email \
  --to="foo <[email-masked]>,bar <[email-masked]>" \
  --cc="main list <[email-masked]>, sub list <[email-masked]>" \
  /path/to/series/*.patch
```

[This is the same behavior as Thunderbird.]

In my linux kernel tree (linux.git) used for development, I add
sendemail-validate hook that adds DKIM-like attestation with patatt:

```
#!/bin/sh
# installed by patatt install-hook
patatt sign --hook "${1}"
```

Starting from Git v2.41.0, when I try to use git-send-email(1), I got
perl-related error:

```
Use of uninitialized value $address in sprintf at /home/bagas/.app/git/dist/v2.42.0/libexec/git-core/git-send-email line 1172.
error: unable to extract a valid address from:
```

It looks like git-send-email(1) trips on cover letter since there is no
recipient addresses there, and also on patches without Signed-off-by: trailer.

Bisecting between v2.40.0 and v2.41.0, the culprit is commit a8022c5f7b67
(send-email: expose header information to git-send-email's sendemail-validate
hook, 2023-04-19). The perl error should have been reduced by [2], but this
address splitting (parsing) is still not addressed.

The full bisection log is:

```
git bisect start '--term-good=ok' '--term-bad=oops'
# status: waiting for both good and bad commits
# ok: [73876f4861cd3d187a4682290ab75c9dccadbc56] Git 2.40
git bisect ok 73876f4861cd3d187a4682290ab75c9dccadbc56
# status: waiting for bad commit, 1 good commit known
# oops: [fe86abd7511a9a6862d5706c6fa1d9b57a63ba09] Git 2.41
git bisect oops fe86abd7511a9a6862d5706c6fa1d9b57a63ba09
# ok: [b64894c2063e5875bfd95b537eafcb3e1abf46ff] Merge branch 'ow/ref-filter-omit-empty'
git bisect ok b64894c2063e5875bfd95b537eafcb3e1abf46ff
# ok: [ccd12a3d6cc62f51b746654ae56e26d92f89ba92] Merge branch 'en/header-split-cache-h-part-2'
git bisect ok ccd12a3d6cc62f51b746654ae56e26d92f89ba92
# oops: [1e1dcb2a423cad350e8f20fdcc957064e5cff528] Merge branch 'jc/dirstat-plug-leaks'
git bisect oops 1e1dcb2a423cad350e8f20fdcc957064e5cff528
# oops: [40a5d2b79b57378cc36d43d3b30e704100dc1492] Merge branch 'fc/doc-man-lift-title-length-limit'
git bisect oops 40a5d2b79b57378cc36d43d3b30e704100dc1492
# ok: [07ac32fff94b245aec3e2b80efad0b5dada629cb] Merge branch 'ma/gittutorial-fixes'
git bisect ok 07ac32fff94b245aec3e2b80efad0b5dada629cb
# oops: [7f3cc51b284d696fdb8dfbd8c9f9d0c014019d93] Merge branch 'ar/test-cleanup-unused-file-creation-part2'
git bisect oops 7f3cc51b284d696fdb8dfbd8c9f9d0c014019d93
# oops: [b6e9521956b752be4c666efedd7b91bdd05f9756] Merge branch 'ms/send-email-feed-header-to-validate-hook'
git bisect oops b6e9521956b752be4c666efedd7b91bdd05f9756
# ok: [e2abfa7212525daa24a52d9f53c45b736abb5dfe] Merge branch 'hx/negotiator-non-recursive'
git bisect ok e2abfa7212525daa24a52d9f53c45b736abb5dfe
# oops: [a8022c5f7b678189135b6caa3fadb3d8ec0c0d48] send-email: expose header information to git-send-email's sendemail-validate hook
git bisect oops a8022c5f7b678189135b6caa3fadb3d8ec0c0d48
# ok: [56adddaa06d376f3977ee91e8a769cd85439d21c] send-email: refactor header generation functions
git bisect ok 56adddaa06d376f3977ee91e8a769cd85439d21c
# first oops commit: [a8022c5f7b678189135b6caa3fadb3d8ec0c0d48] send-email: expose header information to git-send-email's sendemail-validate hook
```

To reproduce this regression:

1. Clone git.git repo, then branch off:

   ```
   $ git clone https://github.com/git/git.git && cd git
   $ git checkout -b test
   ```

2. Make two dummy signed-off commits:

   ```
   $ echo test > test && git add test && git commit -s -m "test"
   $ echo "test test" >> test && git commit -a -s -m "test test"
   ```

3. Generate patch series:

   ```
   $ mkdir /tmp/test
   $ git format-patch -o /tmp/test --cover-letter main
   ```

4. Send the series to dummy address:

   ```
   $ git send-email --to="foo <[email-masked]>,bar <[email-masked]>" /tmp/test/*.patch
   ```

My system runs Debian testing (trixie/sid) with perl 5.36.0.

Thanks.

[1]: https://lore.kernel.org/git/[email-masked]/
[2]: https://lore.kernel.org/git/[email-masked]/

-- 
An old man doll... just what I always wanted! - Clara