]> git.ipfire.org Git - people/ms/dma.git/commitdiff
dma: constify bounce reason and avoid strdup
authorSimon Schubert <simon.schubert@epfl.ch>
Thu, 9 Jul 2009 20:21:26 +0000 (22:21 +0200)
committerSimon Schubert <corecode@dragonflybsd.org>
Thu, 16 Jul 2009 14:13:06 +0000 (16:13 +0200)
We don't need to care about freeing the bounce reason string, because
bounce is only called once.  Convert all bounce reason strings to
const char * and avoid calling strdup() on them.  Dynamic strings from
asprintf() need some de-const massaging.

dma.c
dma.h
net.c

diff --git a/dma.c b/dma.c
index f9d1eb6ba02898c696b138a5038ee9fb7beac143..9ca7f990e3bdfd9291afcedb7e161d99ee296dab 100644 (file)
--- a/dma.c
+++ b/dma.c
@@ -527,7 +527,7 @@ go_background(struct queue *queue)
 }
 
 static void
-bounce(struct qitem *it, char *reason)
+bounce(struct qitem *it, const char *reason)
 {
        struct queue bounceq;
        struct qitem *bit;
@@ -587,7 +587,6 @@ There was an error delivering your mail to <%s>.\n\
                reason,
                config->features & FULLBOUNCE? "Original message follows.":
                "Message headers follow.");
-       free(reason);
        if (error < 0)
                goto fail;
        if (fflush(bit->queuef) != 0)
@@ -630,7 +629,7 @@ fail:
 }
 
 static int
-deliver_local(struct qitem *it, char **errmsg)
+deliver_local(struct qitem *it, const char **errmsg)
 {
        char fn[PATH_MAX+1];
        char line[1000];
@@ -678,7 +677,7 @@ deliver_local(struct qitem *it, char **errmsg)
                if (linelen == 0 || line[linelen - 1] != '\n') {
                        syslog(LOG_CRIT, "%s: local delivery failed: corrupted queue file",
                               it->queueid);
-                       *errmsg = strdup("corrupted queue file");
+                       *errmsg = "corrupted queue file";
                        error = -1;
                        goto chop;
                }
@@ -715,7 +714,7 @@ deliver(struct qitem *it)
 {
        int error;
        unsigned int backoff = MIN_RETRY;
-       char *errmsg = strdup("unknown bounce reason");
+       const char *errmsg = "unknown bounce reason";
        struct timeval now;
        struct stat st;
 
@@ -746,7 +745,7 @@ retry:
                }
                if (gettimeofday(&now, NULL) == 0 &&
                    (now.tv_sec - st.st_mtimespec.tv_sec > MAX_TIMEOUT)) {
-                       asprintf(&errmsg,
+                       asprintf(__DECONST(void *, &errmsg),
                                 "Could not deliver for the last %d seconds. Giving up.",
                                 MAX_TIMEOUT);
                        goto bounce;
diff --git a/dma.h b/dma.h
index 49a2ae6b338d653d7b9374d54978d829c663b6c2..9128f37650cce61045b526658d940be14aa23695 100644 (file)
--- a/dma.h
+++ b/dma.h
@@ -165,7 +165,7 @@ extern int smtp_init_crypto(struct qitem *, int, int);
 /* net.c */
 extern int read_remote(int, int, char *);
 extern ssize_t send_remote_command(int, const char*, ...);
-extern int deliver_remote(struct qitem *, char **);
+extern int deliver_remote(struct qitem *, const char **);
 
 /* base64.c */
 extern int base64_encode(const void *, int, char **);
diff --git a/net.c b/net.c
index 60db6705adf1067eab50f3bbcad7e3125073661e..7657404351f064c0c3b9bb8bbeb9a3d64d4765e9 100644 (file)
--- a/net.c
+++ b/net.c
@@ -314,17 +314,19 @@ open_connection(struct qitem *it, const char *host)
 }
 
 int
-deliver_remote(struct qitem *it, char **errmsg)
+deliver_remote(struct qitem *it, const char **errmsg)
 {
        struct authuser *a;
        char *host, line[1000];
        int fd, error = 0, do_auth = 0, res = 0;
        size_t linelen;
+       /* asprintf can't take const */
+       void *errmsgc = __DECONST(char **, errmsg);
 
        host = strrchr(it->addr, '@');
        /* Should not happen */
        if (host == NULL) {
-               asprintf(errmsg, "Internal error: badly formed address %s",
+               asprintf(errmsgc, "Internal error: badly formed address %s",
                    it->addr);
                return(-1);
        } else {
@@ -373,7 +375,7 @@ deliver_remote(struct qitem *it, char **errmsg)
                if (read_remote(fd, 0, NULL) != 2) {
                        syslog(LOG_ERR, "%s: remote delivery deferred: "
                               " EHLO failed: %s", it->queueid, neterr);
-                       asprintf(errmsg, "%s did not like our EHLO:\n%s",
+                       asprintf(errmsgc, "%s did not like our EHLO:\n%s",
                            host, neterr);
                        return (-1);
                }
@@ -384,7 +386,7 @@ deliver_remote(struct qitem *it, char **errmsg)
                if (read_remote(fd, 0, NULL) != 2) {
                        syslog(LOG_ERR, "%s: remote delivery deferred: "
                               " EHLO failed: %s", it->queueid, neterr);
-                       asprintf(errmsg, "%s did not like our EHLO:\n%s",
+                       asprintf(errmsgc, "%s did not like our EHLO:\n%s",
                            host, neterr);
                        return (-1);
                }
@@ -412,7 +414,7 @@ deliver_remote(struct qitem *it, char **errmsg)
                if (error < 0) {
                        syslog(LOG_ERR, "%s: remote delivery failed:"
                                        " SMTP login failed: %m", it->queueid);
-                       asprintf(errmsg, "SMTP login to %s failed", host);
+                       asprintf(errmsgc, "SMTP login to %s failed", host);
                        return (-1);
                }
                /* SMTP login is not available, so try without */
@@ -426,7 +428,7 @@ deliver_remote(struct qitem *it, char **errmsg)
        if (res == 5) { \
                syslog(LOG_ERR, "%s: remote delivery failed: " \
                       c " failed: %s", it->queueid, neterr); \
-               asprintf(errmsg, "%s did not like our " c ":\n%s", \
+               asprintf(errmsgc, "%s did not like our " c ":\n%s", \
                    host, neterr); \
                return (-1); \
        } else if (res != exp) { \
@@ -457,7 +459,7 @@ deliver_remote(struct qitem *it, char **errmsg)
                if (linelen == 0 || line[linelen - 1] != '\n') {
                        syslog(LOG_CRIT, "%s: remote delivery failed:"
                                "corrupted queue file", it->queueid);
-                       *errmsg = strdup("corrupted queue file");
+                       *errmsg = "corrupted queue file";
                        error = -1;
                        goto out;
                }