summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Harris <jgh146exb@wizmail.org>2022-03-24 22:47:04 +0000
committerJeremy Harris <jgh146exb@wizmail.org>2022-03-28 12:24:48 +0100
commitc3d6f1ff09458b3e7619f9bc4799aec0ab5fc2f2 (patch)
tree13e3ea5fbb332402c645e00955a8c8b10fca1647
parentcfe6acff2ddc7eb03b3489770219edf829abd323 (diff)
downloadexim4-c3d6f1ff09458b3e7619f9bc4799aec0ab5fc2f2.tar.gz
Logging: fix crash on local_part utf8-conversion fail
Broken-by: d2f99aad04
-rw-r--r--src/src/deliver.c44
1 files changed, 19 insertions, 25 deletions
diff --git a/src/src/deliver.c b/src/src/deliver.c
index 029b7a59b..1259cbe81 100644
--- a/src/src/deliver.c
+++ b/src/src/deliver.c
@@ -953,9 +953,22 @@ router_name = transport_name = NULL;
/*************************************************
-* Generate local prt for logging *
+* Generate local part for logging *
*************************************************/
+static uschar *
+string_get_lpart_sub(const address_item * addr, uschar * s)
+{
+#ifdef SUPPORT_I18N
+if (testflag(addr, af_utf8_downcvt))
+ {
+ uschar * t = string_localpart_utf8_to_alabel(s, NULL);
+ return t ? t : s; /* t is NULL on a failed conversion */
+ }
+#endif
+return s;
+}
+
/* This function is a subroutine for use in string_log_address() below.
Arguments:
@@ -970,32 +983,13 @@ string_get_localpart(address_item * addr, gstring * yield)
{
uschar * s;
-s = addr->prefix;
-if (testflag(addr, af_include_affixes) && s)
- {
-#ifdef SUPPORT_I18N
- if (testflag(addr, af_utf8_downcvt))
- s = string_localpart_utf8_to_alabel(s, NULL);
-#endif
- yield = string_cat(yield, s);
- }
+if (testflag(addr, af_include_affixes) && (s = addr->prefix))
+ yield = string_cat(yield, string_get_lpart_sub(addr, s));
-s = addr->local_part;
-#ifdef SUPPORT_I18N
-if (testflag(addr, af_utf8_downcvt))
- s = string_localpart_utf8_to_alabel(s, NULL);
-#endif
-yield = string_cat(yield, s);
+yield = string_cat(yield, string_get_lpart_sub(addr, addr->local_part));
-s = addr->suffix;
-if (testflag(addr, af_include_affixes) && s)
- {
-#ifdef SUPPORT_I18N
- if (testflag(addr, af_utf8_downcvt))
- s = string_localpart_utf8_to_alabel(s, NULL);
-#endif
- yield = string_cat(yield, s);
- }
+if (testflag(addr, af_include_affixes) && (s = addr->suffix))
+ yield = string_cat(yield, string_get_lpart_sub(addr, s));
return yield;
}