summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacek Masiulaniec <jacekm@cvs.openbsd.org>2009-09-21 20:35:27 +0000
committerJacek Masiulaniec <jacekm@cvs.openbsd.org>2009-09-21 20:35:27 +0000
commit71a87c745f33a23035edcd8b8ab2192b86f2bbbe (patch)
tree490106449a1dd4d0a92ed2506d9c26d299c93ed9
parentc4ccc49f047facec76d0028af2cc305ad02b1195 (diff)
Expand "&" in the name part of gecos similarly to how sendmail and finger
expand it. Based on a diff from landry@, thanks!
-rw-r--r--usr.sbin/smtpd/enqueue.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/usr.sbin/smtpd/enqueue.c b/usr.sbin/smtpd/enqueue.c
index 3b0fc046d68..e683354297b 100644
--- a/usr.sbin/smtpd/enqueue.c
+++ b/usr.sbin/smtpd/enqueue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: enqueue.c,v 1.23 2009/09/18 00:04:26 jacekm Exp $ */
+/* $OpenBSD: enqueue.c,v 1.24 2009/09/21 20:35:26 jacekm Exp $ */
/*
* Copyright (c) 2005 Henning Brauer <henning@bulabula.org>
@@ -290,13 +290,22 @@ build_from(char *fake_from, struct passwd *pw)
}
if (msg.fromname == NULL && fake_from == NULL && pw != NULL) {
- size_t len;
+ int len, apos;
len = strcspn(pw->pw_gecos, ",");
- len++; /* null termination */
- if ((msg.fromname = malloc(len)) == NULL)
- err(1, NULL);
- strlcpy(msg.fromname, pw->pw_gecos, len);
+ if ((p = memchr(pw->pw_gecos, '&', len))) {
+ apos = p - pw->pw_gecos;
+ if (asprintf(&msg.fromname, "%.*s%s%.*s",
+ apos, pw->pw_gecos,
+ pw->pw_name,
+ len - apos - 1, p + 1) == -1)
+ err(1, NULL);
+ msg.fromname[apos] = toupper(msg.fromname[apos]);
+ } else {
+ if (asprintf(&msg.fromname, "%.*s", len,
+ pw->pw_gecos) == -1)
+ err(1, NULL);
+ }
}
}