]> git.ipfire.org Git - people/ms/dma.git/commitdiff
convert most asprintf to statically allocated buffers
authorSimon Schubert <2@0x2c.org>
Thu, 28 Oct 2010 16:53:09 +0000 (18:53 +0200)
committerSimon Schubert <2@0x2c.org>
Thu, 28 Oct 2010 16:53:09 +0000 (18:53 +0200)
drop 13-hardening.patch because it is not necessary anymore

debian/patches/13-hardening.patch [deleted file]
dma.c
dma.h
local.c
net.c
util.c

diff --git a/debian/patches/13-hardening.patch b/debian/patches/13-hardening.patch
deleted file mode 100644 (file)
index f7a7bbb..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-Description: Build hardening: check a few more return values.
-Origin: other: http://svn.ringlet.net/svn/ringlet/mail/dma/
-Forwarded: yes
-Author: Peter Pentchev <roam@ringlet.net>
-Last-Update: 2010-06-21
-
---- a/util.c
-+++ b/util.c
-@@ -92,9 +92,9 @@
-               char *sufx;
-               va_start(ap, fmt);
--              vasprintf(&sufx, fmt, ap);
--              if (sufx != NULL) {
--                      asprintf(&tag, "%s[%s]", logident_base, sufx);
-+              if (vasprintf(&sufx, fmt, ap) != -1 && sufx != NULL) {
-+                      if (asprintf(&tag, "%s[%s]", logident_base, sufx) == -1)
-+                              tag = NULL;
-                       free(sufx);
-               }
-               va_end(ap);
-@@ -112,7 +112,8 @@
-       if (fmt != NULL) {
-               va_start(ap, fmt);
--              vasprintf(&outs, fmt, ap);
-+              if (vasprintf(&outs, fmt, ap) == -1)
-+                      outs = NULL;
-               va_end(ap);
-       }
-@@ -135,7 +136,8 @@
-       if (fmt != NULL) {
-               va_start(ap, fmt);
--              vasprintf(&outs, fmt, ap);
-+              if (vasprintf(&outs, fmt, ap) == -1)
-+                      outs = NULL;
-               va_end(ap);
-       }
-@@ -189,8 +191,8 @@
-               else
-                       free(u);
-       }
--      asprintf(__DECONST(void *, &username), "%ld", (long)uid);
--      if (username != NULL)
-+      if (asprintf(__DECONST(void *, &username), "%ld", (long)uid) != -1 &&
-+          username != NULL)
-               return;
-       username = "unknown-or-invalid-username";
- }
diff --git a/dma.c b/dma.c
index f8d893fbe99e465af1aafe839054e94709dbc577..a3e2a70bb4941763626001f4eb62329db572861a 100644 (file)
--- a/dma.c
+++ b/dma.c
@@ -64,8 +64,9 @@ static void deliver(struct qitem *);
 struct aliases aliases = LIST_HEAD_INITIALIZER(aliases);
 struct strlist tmpfs = SLIST_HEAD_INITIALIZER(tmpfs);
 struct authusers authusers = LIST_HEAD_INITIALIZER(authusers);
-const char *username;
+char username[USERNAME_SIZE];
 const char *logident_base;
+char errmsg[ERRMSG_SIZE];
 
 static int daemonize = 1;
 
@@ -271,17 +272,18 @@ deliver(struct qitem *it)
 {
        int error;
        unsigned int backoff = MIN_RETRY;
-       const char *errmsg = "unknown bounce reason";
        struct timeval now;
        struct stat st;
 
+       snprintf(errmsg, sizeof(errmsg), "unknown bounce reason");
+
 retry:
        syslog(LOG_INFO, "trying delivery");
 
        if (it->remote)
-               error = deliver_remote(it, &errmsg);
+               error = deliver_remote(it);
        else
-               error = deliver_local(it, &errmsg);
+               error = deliver_local(it);
 
        switch (error) {
        case 0:
@@ -296,7 +298,7 @@ retry:
                }
                if (gettimeofday(&now, NULL) == 0 &&
                    (now.tv_sec - st.st_mtim.tv_sec > MAX_TIMEOUT)) {
-                       asprintf(__DECONST(void *, &errmsg),
+                       snprintf(errmsg, sizeof(errmsg),
                                 "Could not deliver for the last %d seconds. Giving up.",
                                 MAX_TIMEOUT);
                        goto bounce;
diff --git a/dma.h b/dma.h
index fd92980a42ca6fcafa26d547929ec4c243ac7c20..60a83451ca38ada34f8cdecc07512650af0199ad 100644 (file)
--- a/dma.h
+++ b/dma.h
@@ -47,6 +47,8 @@
 #define VERSION        "DragonFly Mail Agent " DMA_VERSION
 
 #define BUF_SIZE       2048
+#define ERRMSG_SIZE    200
+#define USERNAME_SIZE  50
 #define MIN_RETRY      300             /* 5 minutes */
 #define MAX_RETRY      (3*60*60)       /* retry at least every 3 hours */
 #define MAX_TIMEOUT    (5*24*60*60)    /* give up after 5 days */
@@ -141,10 +143,11 @@ extern struct aliases aliases;
 extern struct config config;
 extern struct strlist tmpfs;
 extern struct authusers authusers;
-extern const char *username;
+extern char username[USERNAME_SIZE];
 extern const char *logident_base;
 
-extern char neterr[BUF_SIZE];
+extern char neterr[ERRMSG_SIZE];
+extern char errmsg[ERRMSG_SIZE];
 
 /* aliases_parse.y */
 int yyparse(void);
@@ -167,7 +170,7 @@ int dns_get_mx_list(const char *, int, struct mx_hostentry **, int);
 char *ssl_errstr(void);
 int read_remote(int, int, char *);
 ssize_t send_remote_command(int, const char*, ...);
-int deliver_remote(struct qitem *, const char **);
+int deliver_remote(struct qitem *);
 
 /* base64.c */
 int base64_encode(const void *, int, char **);
@@ -186,7 +189,7 @@ int acquirespool(struct qitem *);
 void dropspool(struct queue *, struct qitem *);
 
 /* local.c */
-int deliver_local(struct qitem *, const char **errmsg);
+int deliver_local(struct qitem *);
 
 /* mail.c */
 void bounce(struct qitem *, const char *);
diff --git a/local.c b/local.c
index 42250e2ff9bb91822a39e19ef065b3742db72243..bb5c1dfbda7357ab198b4bc32b75e98f6b2f571d 100644 (file)
--- a/local.c
+++ b/local.c
@@ -10,7 +10,7 @@
 #include "dma.h"
 
 int
-deliver_local(struct qitem *it, const char **errmsg)
+deliver_local(struct qitem *it)
 {
        char fn[PATH_MAX+1];
        char line[1000];
@@ -76,7 +76,7 @@ deliver_local(struct qitem *it, const char **errmsg)
                linelen = strlen(line);
                if (linelen == 0 || line[linelen - 1] != '\n') {
                        syslog(LOG_CRIT, "local delivery failed: corrupted queue file");
-                       *errmsg = "corrupted queue file";
+                       snprintf(errmsg, sizeof(errmsg), "corrupted queue file");
                        error = -1;
                        goto chop;
                }
diff --git a/net.c b/net.c
index 79f5a2bffc4e079b920935b84fe426893e095f52..1622b7c72c897a56845782c5e778229049ecbb60 100644 (file)
--- a/net.c
+++ b/net.c
@@ -57,7 +57,7 @@
 
 #include "dma.h"
 
-char neterr[BUF_SIZE];
+char neterr[ERRMSG_SIZE];
 
 char *
 ssl_errstr(void)
@@ -348,7 +348,7 @@ close_connection(int fd)
 }
 
 static int
-deliver_to_host(struct qitem *it, struct mx_hostentry *host, void *errmsgc)
+deliver_to_host(struct qitem *it, struct mx_hostentry *host)
 {
        struct authuser *a;
        char line[1000];
@@ -356,7 +356,7 @@ deliver_to_host(struct qitem *it, struct mx_hostentry *host, void *errmsgc)
        int fd, error = 0, do_auth = 0, res = 0;
 
        if (fseek(it->mailf, 0, SEEK_SET) != 0) {
-               asprintf(errmsgc, "can not seek: %s", strerror(errno));
+               snprintf(errmsg, sizeof(errmsg), "can not seek: %s", strerror(errno));
                return (-1);
        }
 
@@ -369,7 +369,7 @@ deliver_to_host(struct qitem *it, struct mx_hostentry *host, void *errmsgc)
        if (res == 5) { \
                syslog(LOG_ERR, "remote delivery to %s [%s] failed after %s: %s", \
                       host->host, host->addr, c, neterr); \
-               asprintf(errmsgc, "%s [%s] did not like our %s:\n%s", \
+               snprintf(errmsg, sizeof(errmsg), "%s [%s] did not like our %s:\n%s", \
                         host->host, host->addr, c, neterr); \
                return (-1); \
        } else if (res != exp) { \
@@ -418,7 +418,7 @@ deliver_to_host(struct qitem *it, struct mx_hostentry *host, void *errmsgc)
                if (error < 0) {
                        syslog(LOG_ERR, "remote delivery failed:"
                                        " SMTP login failed: %m");
-                       asprintf(errmsgc, "SMTP login to %s failed", host->host);
+                       snprintf(errmsg, sizeof(errmsg), "SMTP login to %s failed", host->host);
                        return (-1);
                }
                /* SMTP login is not available, so try without */
@@ -445,7 +445,7 @@ deliver_to_host(struct qitem *it, struct mx_hostentry *host, void *errmsgc)
                linelen = strlen(line);
                if (linelen == 0 || line[linelen - 1] != '\n') {
                        syslog(LOG_CRIT, "remote delivery failed: corrupted queue file");
-                       *(const char **)errmsgc = "corrupted queue file";
+                       snprintf(errmsg, sizeof(errmsg), "corrupted queue file");
                        error = -1;
                        goto out;
                }
@@ -480,10 +480,8 @@ out:
 }
 
 int
-deliver_remote(struct qitem *it, const char **errmsg)
+deliver_remote(struct qitem *it)
 {
-       /* asprintf can't take const */
-       void *errmsgc = __DECONST(char **, errmsg);
        struct mx_hostentry *hosts, *h;
        const char *host;
        int port;
@@ -492,7 +490,7 @@ deliver_remote(struct qitem *it, const char **errmsg)
        host = strrchr(it->addr, '@');
        /* Should not happen */
        if (host == NULL) {
-               asprintf(errmsgc, "Internal error: badly formed address %s",
+               snprintf(errmsg, sizeof(errmsg), "Internal error: badly formed address %s",
                    it->addr);
                return(-1);
        } else {
@@ -519,7 +517,7 @@ deliver_remote(struct qitem *it, const char **errmsg)
        }
 
        for (h = hosts; *h->host != 0; h++) {
-               switch (deliver_to_host(it, h, errmsgc)) {
+               switch (deliver_to_host(it, h)) {
                case 0:
                        /* success */
                        error = 0;
diff --git a/util.c b/util.c
index e25cdb5653c5855281f4a1a053ca390375824855..ff6b123538ce462874c9e3b690e83dec9136f304 100644 (file)
--- a/util.c
+++ b/util.c
@@ -91,22 +91,20 @@ hostname(void)
 void
 setlogident(const char *fmt, ...)
 {
-       char *tag = NULL;
+       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
@@ -114,16 +112,16 @@ errlog(int exitcode, const char *fmt, ...)
 {
        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) {
+       if (*outs != 0) {
                syslog(LOG_ERR, "%s: %m", outs);
                fprintf(stderr, "%s: %s: %s\n", getprogname(), outs, strerror(oerrno));
        } else {
@@ -138,16 +136,16 @@ void
 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 {
@@ -158,49 +156,39 @@ errlogx(int exitcode, const char *fmt, ...)
        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)
+       if (check_username(getlogin(), uid))
                return;
-       username = check_username(getenv("LOGNAME"), uid);
-       if (username != NULL)
+       if (check_username(getenv("LOGNAME"), uid))
                return;
-       username = check_username(getenv("USER"), uid);
-       if (username != NULL)
+       if (check_username(getenv("USER"), uid))
                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)
+       if (pwd != NULL && pwd->pw_name != NULL && pwd->pw_name[0] != '\0') {
+               if (check_username(pwd->pw_name, uid))
                        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)uid);
 }
 
 void