#include <sys/param.h>
#include <sys/file.h>
+#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
const char *
hostname(void)
{
- static char name[MAXHOSTNAMELEN+1];
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+ static char name[HOST_NAME_MAX+1];
static int initialized = 0;
- FILE *fp;
- char *res;
- size_t len;
+ char *s;
if (initialized)
return (name);
- if (config.mailname != NULL && config.mailname[0] != '\0') {
+ if (config.mailname == NULL || !*config.mailname)
+ goto local;
+
+ if (config.mailname[0] == '/') {
+ /*
+ * If the mailname looks like an absolute path,
+ * treat it as a file.
+ */
+ FILE *fp;
+
+ fp = fopen(config.mailname, "r");
+ if (fp == NULL)
+ goto local;
+
+ s = fgets(name, sizeof(name), fp);
+ fclose(fp);
+ if (s == NULL)
+ goto local;
+
+ for (s = name; *s != 0 && (isalnum(*s) || strchr("_.-", *s)); ++s)
+ /* NOTHING */;
+ *s = 0;
+
+ if (!*name)
+ goto local;
+
+ initialized = 1;
+ return (name);
+ } else {
snprintf(name, sizeof(name), "%s", config.mailname);
initialized = 1;
return (name);
}
- if (config.mailnamefile != NULL && config.mailnamefile[0] != '\0') {
- fp = fopen(config.mailnamefile, "r");
- if (fp != NULL) {
- res = fgets(name, sizeof(name), fp);
- fclose(fp);
- if (res != NULL) {
- len = strlen(name);
- while (len > 0 &&
- (name[len - 1] == '\r' ||
- name[len - 1] == '\n'))
- name[--len] = '\0';
- if (name[0] != '\0') {
- initialized = 1;
- return (name);
- }
- }
- }
- }
+
+local:
if (gethostname(name, sizeof(name)) != 0)
- strcpy(name, "(unknown hostname)");
+ *name = 0;
+ /*
+ * gethostname() is allowed to truncate name without NUL-termination
+ * and at the same time not return an error.
+ */
+ name[sizeof(name) - 1] = 0;
+
+ for (s = name; *s != 0 && (isalnum(*s) || strchr("_.-", *s)); ++s)
+ /* NOTHING */;
+ *s = 0;
+
+ if (!*name)
+ snprintf(name, sizeof(name), "unknown-hostname");
+
initialized = 1;
- return name;
+ return (name);
}
void
setlogident(const char *fmt, ...)
{
- char *tag = NULL;
+ static char tag[50];
+ snprintf(tag, sizeof(tag), "%s", logident_base);
if (fmt != NULL) {
va_list ap;
- char *sufx;
+ char sufx[50];
va_start(ap, fmt);
- if (vasprintf(&sufx, fmt, ap) != -1 && sufx != NULL) {
- if (asprintf(&tag, "%s[%s]", logident_base, sufx) == -1)
- tag = NULL;
- free(sufx);
- }
+ vsnprintf(sufx, sizeof(sufx), fmt, ap);
va_end(ap);
+ snprintf(tag, sizeof(tag), "%s[%s]", logident_base, sufx);
}
closelog();
- openlog(tag != NULL ? tag : logident_base, 0, LOG_MAIL);
+ openlog(tag, 0, LOG_MAIL);
}
void
{
int oerrno = errno;
va_list ap;
- char *outs = NULL;
+ char outs[ERRMSG_SIZE];
+ outs[0] = 0;
if (fmt != NULL) {
va_start(ap, fmt);
- if (vasprintf(&outs, fmt, ap) == -1)
- outs = NULL;
+ vsnprintf(outs, sizeof(outs), fmt, ap);
va_end(ap);
}
- if (outs != NULL) {
+ errno = oerrno;
+ if (*outs != 0) {
syslog(LOG_ERR, "%s: %m", outs);
fprintf(stderr, "%s: %s: %s\n", getprogname(), outs, strerror(oerrno));
} else {
errlogx(int exitcode, const char *fmt, ...)
{
va_list ap;
- char *outs = NULL;
+ char outs[ERRMSG_SIZE];
+ outs[0] = 0;
if (fmt != NULL) {
va_start(ap, fmt);
- if (vasprintf(&outs, fmt, ap) == -1)
- outs = NULL;
+ vsnprintf(outs, sizeof(outs), fmt, ap);
va_end(ap);
}
- if (outs != NULL) {
+ if (*outs != 0) {
syslog(LOG_ERR, "%s", outs);
fprintf(stderr, "%s: %s\n", getprogname(), outs);
} else {
exit(exitcode);
}
-static const char *
+static int
check_username(const char *name, uid_t ckuid)
{
struct passwd *pwd;
if (name == NULL)
- return (NULL);
+ return (0);
pwd = getpwnam(name);
if (pwd == NULL || pwd->pw_uid != ckuid)
- return (NULL);
- return (name);
+ return (0);
+ snprintf(username, sizeof(username), "%s", name);
+ return (1);
}
void
set_username(void)
{
struct passwd *pwd;
- char *u = NULL;
- uid_t uid;
- uid = getuid();
- username = check_username(getlogin(), uid);
- if (username != NULL)
+ useruid = getuid();
+ if (check_username(getlogin(), useruid))
return;
- username = check_username(getenv("LOGNAME"), uid);
- if (username != NULL)
+ if (check_username(getenv("LOGNAME"), useruid))
return;
- username = check_username(getenv("USER"), uid);
- if (username != NULL)
+ if (check_username(getenv("USER"), useruid))
return;
- pwd = getpwuid(uid);
- if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0' &&
- (u = strdup(pwd->pw_name)) != NULL) {
- username = check_username(u, uid);
- if (username != NULL)
+ pwd = getpwuid(useruid);
+ if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0') {
+ if (check_username(pwd->pw_name, useruid))
return;
- else
- free(u);
}
- if (asprintf(__DECONST(void *, &username), "%ld", (long)uid) != -1 &&
- username != NULL)
- return;
- username = "unknown-or-invalid-username";
+ snprintf(username, sizeof(username), "uid=%ld", (long)useruid);
}
void