Fix three issues highlighted by clang analyser.
authorPhil Pennock <pdp@exim.org>
Fri, 18 May 2012 22:22:30 +0000 (18:22 -0400)
committerPhil Pennock <pdp@exim.org>
Fri, 18 May 2012 22:22:30 +0000 (18:22 -0400)
Only crash-plausible issue would require the Cambridge-specific
iplookup router and a misconfiguration.

Report from Marcin MirosÅ‚aw

doc/doc-txt/ChangeLog
src/src/auths/spa.c
src/src/malware.c
src/src/routers/iplookup.c

index 2c0646b54d38d5c5d654efb449489cce08476ac5..08fd2efe5984c69cdfa1da4a6e82ddf47e922fd9 100644 (file)
@@ -122,6 +122,11 @@ PP/28 Fix DCC dcc_header content corruption (stack memory referenced,
       read-only, out of scope).
       Patch from Wolfgang Breyha, report from Stuart Northfield.
 
+PP/29 Fix three issues highlighted by clang analyser static analysis.
+      Only crash-plausible issue would require the Cambridge-specific
+      iplookup router and a misconfiguration.
+      Report from Marcin MirosÅ‚aw.
+
 
 Exim version 4.77
 -----------------
index d69c2e4fe473f07a0ca2e5366784bd016e574b66..1abd657813b3d5d3d86fa550553675f49343ce5d 100644 (file)
@@ -202,6 +202,11 @@ auth_vars[0] = expand_nstring[1] = msgbuf;
 expand_nlength[1] = Ustrlen(msgbuf);
 expand_nmax = 1;
 
+/* clean up globals which aren't referenced, but still shouldn't be left
+pointing to stack memory */
+#define CLEANUP_RETURN(Code) do { auth_vars[0] = expand_nstring[1] = NULL; \
+  expand_nlength[1] = expand_nmax = 0; return (Code); } while (0);
+
 debug_print_string(ablock->server_debug_string);    /* customized debug */
 
 /* look up password */
@@ -213,13 +218,13 @@ if (clearpass == NULL)
     {
     DEBUG(D_auth) debug_printf("auth_spa_server(): forced failure while "
       "expanding spa_serverpassword\n");
-    return FAIL;
+    CLEANUP_RETURN(FAIL);
     }
   else
     {
     DEBUG(D_auth) debug_printf("auth_spa_server(): error while expanding "
       "spa_serverpassword: %s\n", expand_string_message);
-    return DEFER;
+    CLEANUP_RETURN(DEFER);
     }
   }
 
@@ -234,11 +239,14 @@ if (memcmp(ntRespData,
       ((unsigned char*)responseptr)+IVAL(&responseptr->ntResponse.offset,0),
       24) == 0)
   /* success. we have a winner. */
+  {
+  int rc = auth_check_serv_cond(ablock);
+  CLEANUP_RETURN(rc);
+  }
 
   /* Expand server_condition as an authorization check (PH) */
-  return auth_check_serv_cond(ablock);
 
-return FAIL;
+CLEANUP_RETURN(FAIL);
 }
 
 
index 79e2e382758a23e5e58beaefba78bdbcde51562c..8906654839b2b505484e5b9a8983ab9092608954 100644 (file)
@@ -131,6 +131,9 @@ malware_in_file(uschar *eml_filename) {
   set, but if that changes, then it should apply to these tests too */
   unspool_mbox();
 
+  /* silence static analysis tools */
+  message_id = NULL;
+
   return ret;
 }
 
index e9c4df91959716661f2efaa4c51030ba32bf5f07..37280078369af0c2c7cc1b1e5bf3814a43cdecef 100644 (file)
@@ -142,7 +142,7 @@ iplookup_router_entry(
   address_item **addr_succeed)    /* put old address here on success */
 {
 uschar *query = NULL;
-uschar reply[256];
+uschar *reply;
 uschar *hostname, *reroute, *domain, *listptr;
 uschar host_buffer[256];
 host_item *host = store_get(sizeof(host_item));
@@ -161,6 +161,8 @@ pw = pw;
 DEBUG(D_route) debug_printf("%s router called for %s: domain = %s\n",
   rblock->name, addr->address, addr->domain);
 
+reply = store_get(256);
+
 /* Build the query string to send. If not explicitly given, a default of
 "user@domain user@domain" is used. */