This is a longstanding bug which I finally got round to looking at, rather than just installing BSD mail.
I have the following locale, which is what you get for British English on Debian; I assume other locales are similarly defined. LANG=en_GB.UTF-8 LANGUAGE=en_GB:en LC_CTYPE="en_GB.UTF-8" LC_NUMERIC="en_GB.UTF-8" LC_TIME="en_GB.UTF-8" LC_COLLATE="en_GB.UTF-8" LC_MONETARY="en_GB.UTF-8" LC_MESSAGES="en_GB.UTF-8" LC_PAPER="en_GB.UTF-8" LC_NAME="en_GB.UTF-8" LC_ADDRESS="en_GB.UTF-8" LC_TELEPHONE="en_GB.UTF-8" LC_MEASUREMENT="en_GB.UTF-8" LC_IDENTIFICATION="en_GB.UTF-8" LC_ALL= With that, mail(1) SEGVs if I run it to read messages: #0 0x00007ffff7d60ad8 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 #1 0x00007ffff7c78f2f in strdup () from /lib/x86_64-linux-gnu/libc.so.6 #2 0x00007ffff7e82e4e in mu_strdup (s=0x0) at alloc.c:76 #3 0x0000555555579365 in util_get_charset () at util.c:1231 #4 0x00005555555793bb in util_rfc2047_decode (value=0x7fffffffda58) at util.c:1251 #5 0x0000555555566d66 in sender_string (msg=0x555555597f90) at from.c:272 #6 0x0000555555566ddb in hdr_from (args=0x7fffffffdac0, data=0x0) at from.c:290 #7 0x000055555556678c in format_headline (seg=0x55555558d670, mspec=0x555555597e20, msg=0x555555597f90) at from.c:96 #8 0x000055555556796f in mail_from0 (mspec=0x555555597e20, msg=0x555555597f90, data=0x0) at from.c:615 #9 0x0000555555570002 in page_do (func=0x555555567941 <mail_from0>, data=0x0) at page.c:181 #10 0x00005555555679e3 in mail_headers (argc=1, argv=0x5555555af868) at headers.c:34 #11 0x000055555557716d in util_do_command (fmt=0x55555557bf02 "headers") at util.c:144 #12 0x000055555556920f in main (argc=0, argv=0x7fffffffe020) at mail.c:698 This patch fixes it.
diff -rN -u old-mailutils-3.15/mail/util.c new-mailutils-3.15/mail/util.c --- old-mailutils-3.15/mail/util.c 2023-02-20 14:10:45.412646572 +0000 +++ new-mailutils-3.15/mail/util.c 2023-02-20 14:10:45.412646572 +0000 @@ -1223,12 +1223,15 @@ { struct mu_lc_all lc_all = { .flags = 0 }; char *tmp = getenv ("LC_ALL"); - if (!tmp) + if (!tmp || !strlen (tmp)) tmp = getenv ("LANG"); if (tmp && mu_parse_lc_all (tmp, &lc_all, MU_LC_CSET) == 0) { - charset = mu_strdup (lc_all.charset); + if (lc_all.charset) + charset = mu_strdup (lc_all.charset); + else + charset = NULL; mu_lc_all_free (&lc_all); } else