On Wed, Feb 11, 2015 at 06:17:13PM -0800, Corey Ashford wrote:

> From our reading of the code, tag can never be 0 there, so that makes the
> "then" part of the if statement dead code.
> 
> After that, there's another if statement (line 254) that will always
> evaluate as true:
> 
>     if (tag != 0) {
> ...
> 
> 
> In summary, I believe that removing the "tag = 0;" line was not the right
> fix for the seg fault bug, but it's not clear to me what the right fix is.

I would:

diff --git a/src/postlog/postlog.c b/src/postlog/postlog.c
index 6384396..3c22180 100644
--- a/src/postlog/postlog.c
+++ b/src/postlog/postlog.c
@@ -170,7 +170,7 @@ MAIL_VERSION_STAMP_DECLARE;
 int     main(int argc, char **argv)
 {
     struct stat st;
-    char   *slash;
+    char   *progname;
     int     fd;
     int     ch;
     const char *tag;
@@ -200,10 +200,10 @@ int     main(int argc, char **argv)
     /*
      * Set up diagnostics.
      */
-    if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
-       tag = mail_task(slash + 1);
+    if ((progname = strrchr(argv[0], '/')) != 0 && progname[1])
+       tag = mail_task(++progname);
     else
-       tag = mail_task(argv[0]);
+       tag = mail_task(progname = argv[0]);
     if (isatty(STDERR_FILENO))
        msg_vstream_init(tag, VSTREAM_ERR);
     msg_syslog_init(tag, LOG_PID, LOG_FACILITY);
@@ -216,10 +216,12 @@ int     main(int argc, char **argv)
     /*
      * Parse switches.
      */
+    tag = 0;
     while ((ch = GETOPT(argc, argv, "c:ip:t:v")) > 0) {
        switch (ch) {
        default:
-           msg_fatal("usage: %s [-c config_dir] [-i] [-p priority] [-t tag] 
[-v] [text]", tag);
+           msg_fatal("usage: %s [-c config_dir] [-i] [-p priority] [-t tag]"
+                     " [-v] [text]", progname);
            break;
        case 'c':
            if (setenv(CONF_ENV_PATH, optarg, 1) < 0)
@@ -245,12 +247,8 @@ int     main(int argc, char **argv)
      * specified with msg_syslog_init();
      */
     mail_conf_read();
-    if (tag == 0 && strcmp(var_syslog_name, DEF_SYSLOG_NAME) != 0) {
-       if ((slash = strrchr(argv[0], '/')) != 0 && slash[1])
-           tag = mail_task(slash + 1);
-       else
-           tag = mail_task(argv[0]);
-    }
+    if (tag == 0 && strcmp(var_syslog_name, DEF_SYSLOG_NAME) != 0)
+       tag = mail_task(progname);
 
     /*
      * Re-initialize the logging, this time with the tag specified in main.cf

-- 
        Viktor.

Reply via email to