Compilation warnings shushing
authorPhil Pennock <pdp@exim.org>
Sat, 11 Feb 2017 02:00:02 +0000 (21:00 -0500)
committerPhil Pennock <pdp@exim.org>
Sat, 11 Feb 2017 02:08:24 +0000 (21:08 -0500)
With this patch, in clang 3.4.1 we get no compilation complaints if
Local/Makefile contains:

    CC=clang
    CFLAGS+=-Wno-dangling-else -Wno-logical-op-parentheses

* In hash.c, for the OpenSSL case, use assert() to guard the paths which
  can't happen, instead of just assuming that the calling code never has
  a mistake
* Fix some signed/unsigned issues
* Be explicit about some ignored return values
* Some parens around bit-twiddling
* Use our os_getcwd with its extra guards in one place where getcwd was
  called
* FreeBSD: use system iconv, safely, always

(cherry picked from commit 845a3ced80964f562872aba841099adbc8933b40)
Signed-off-by: Phil Pennock <pdp@exim.org>
src/OS/os.h-FreeBSD
src/src/EDITME
src/src/deliver.c
src/src/exim.c
src/src/hash.c
src/src/local_scan.h
src/src/pdkim/pdkim.c
src/src/readconf.c
src/src/transports/smtp.c

index ba4889fecab4b9f0cc246452127d3577c61161d6..a67ca13b73f16227d5a203a0d30b4de31efa164e 100644 (file)
 
 typedef struct flock flock_t;
 
-/* default is non-const */
-#define ICONV_ARG2_TYPE const char **
+/* iconv arg2 type: libiconv in Ports uses "const char* * inbuf" and was
+ * traditionally the only approach available.  The iconv functionality
+ * in libc is "char ** restrict src".
+ *
+ * <https://www.freebsd.org/doc/en/books/porters-handbook/using-iconv.html>
+ * says that libc has iconv since 2013, in 10-CURRENT.  FreeBSD man-pages
+ * shows it included in 10.0-RELEASE.  Writing this in 2017, 10.3 is the
+ * oldest supported release, so we should assume non-libiconv by default.
+ *
+ * Thus we no longer override iconv.
+ *
+ * However, if libiconv is installed, and anything adds /usr/local/include
+ * to include-path (likely) then we'll get that.  So define a variable
+ * which makes the libiconv try to not interfere with OS iconv.
+ */
+#define LIBICONV_PLUG
 
 /* End */
index 15932691e383a9ce8ea7a6497979032a454cb6c3..df74aacde229657078186a3c806014b93b4a69b0 100644 (file)
@@ -689,6 +689,13 @@ HEADERS_CHARSET="ISO-8859-1"
 #
 # but of course there may need to be other things in CFLAGS and EXTRALIBS_EXIM
 # as well.
+#
+# nb: FreeBSD as of 4.89 defines LIBICONV_PLUG to pick up the system iconv
+# more reliably.  If you explicitly want the libiconv Port then as well
+# as adding -liconv you'll want to unset LIBICONV_PLUG.  If you actually need
+# this, let us know, but for now the Exim Maintainers are assuming that this
+# is uncommon and so you'll need to edit OS/os.h-FreeBSD yourself to remove
+# the define.
 
 
 #------------------------------------------------------------------------------
index 85208457fc6e5edb2a05c9e9a512e6c064a61782..c97874a2b6c328bd3d0b1c0598b5a9e7076e6d70 100644 (file)
@@ -4344,7 +4344,7 @@ for (delivery_count = 0; addr_remote; delivery_count++)
          )  )
        && (  !multi_domain
          || (  (
-               !tp->expand_multi_domain || (deliver_set_expansions(next), 1),
+               (void)(!tp->expand_multi_domain || ((void)deliver_set_expansions(next), 1)),
                exp_bool(addr,
                    US"transport", next->transport->name, D_transport,
                    US"multi_domain", next->transport->multi_domain,
index 1f450c533826a2c232f4b3ec360010bae143b1b4..a6a1ea82c3ae507eb1301a335749a642f60edc61 100644 (file)
@@ -2294,7 +2294,7 @@ for (i = 1; i < argc; i++)
       #ifdef ALT_CONFIG_PREFIX
       int sep = 0;
       int len = Ustrlen(ALT_CONFIG_PREFIX);
-      uschar *list = argrest;
+      const uschar *list = argrest;
       uschar *filename;
       while((filename = string_nextinlist(&list, &sep, big_buffer,
              big_buffer_size)) != NULL)
index 059e6d9bb028bda15fc97d265bca0a085b8f5577..7590d55b7f16356ff91ad7eda23c7c07db841287 100644 (file)
@@ -25,7 +25,7 @@ typedef struct sha1 {
 sha1;
 #endif /*STAND_ALONE*/
 
-
+#include <assert.h>
 
 /******************************************************************************/
 #ifdef SHA_OPENSSL
@@ -50,6 +50,9 @@ switch (h->method)
   {
   case HASH_SHA1:   SHA1_Update  (&h->u.sha1, data, len); break;
   case HASH_SHA256: SHA256_Update(&h->u.sha2, data, len); break;
+  /* should be blocked by init not handling these, but be explicit to
+   * guard against accidents later (and hush up clang -Wswitch) */
+  default: assert(0);
   }
 }
 
@@ -62,6 +65,7 @@ switch (h->method)
   {
   case HASH_SHA1:   SHA1_Final  (b->data, &h->u.sha1); break;
   case HASH_SHA256: SHA256_Final(b->data, &h->u.sha2); break;
+  default: assert(0);
   }
 }
 
index bca14bcafc454206db749bf0d8429b07cb1bee3c..bc4fc8e25841f9ee2e87c8f116d467e90e89f5ad 100644 (file)
@@ -115,7 +115,7 @@ typedef struct header_line {
 /* Entries in lists options are in this form. */
 
 typedef struct {
-  const char   *name;
+  const char   *name; /* should have been uschar but too late now */
   int           type;
   void         *value;
 } optionlist;
index 6e76b8e9fa2555e0a8e422b618d87a0bf424940d..4c93de70dd1e14124125bcb41626d82d940f121c 100644 (file)
@@ -1056,13 +1056,13 @@ else for (p = 0; p<len; p++)
        if ((rc = pdkim_header_complete(ctx)) != PDKIM_OK)
          return rc;
 
-       ctx->flags = ctx->flags & ~(PDKIM_SEEN_LF|PDKIM_SEEN_CR) | PDKIM_PAST_HDRS;
+       ctx->flags = (ctx->flags & ~(PDKIM_SEEN_LF|PDKIM_SEEN_CR)) | PDKIM_PAST_HDRS;
        DEBUG(D_acl) debug_printf(
            "PDKIM >> Body data for hash, canonicalized >>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
        continue;
        }
       else
-       ctx->flags = ctx->flags & ~PDKIM_SEEN_CR | PDKIM_SEEN_LF;
+       ctx->flags = (ctx->flags & ~PDKIM_SEEN_CR) | PDKIM_SEEN_LF;
       }
     else if (ctx->flags & PDKIM_SEEN_LF)
       {
index 7751b3607847d92557699b94e22d122d82a829a3..5efe7aa0411ea3378d1a378ab152077e4665919a 100644 (file)
@@ -877,7 +877,7 @@ of the macros list is in reverse-alpha (we prepend them) - so longer
 macros that have substrings are always discovered first during
 expansion. */
 
-for (i = 0; i < nopt; i++)  if (*(s = opts[i].name) && *s != '*')
+for (i = 0; i < nopt; i++)  if (*(s = US opts[i].name) && *s != '*')
   if (group)
     macro_create(string_sprintf("_OPT_%T_%T_%T", section, group, s), US"y", FALSE, TRUE);
   else
@@ -1201,7 +1201,7 @@ for (;;)
         "configuration file %s", ss);
 
     config_filename = string_copy(ss);
-    config_directory = string_copyn(ss, (const uschar*) strrchr(ss, '/') - ss);
+    config_directory = string_copyn(ss, CUstrrchr(ss, '/') - ss);
     config_lineno = 0;
     continue;
     }
@@ -3391,11 +3391,11 @@ if (config_file)
     {
       /* relative configuration file name: working dir + / + basename(filename) */
 
-      char buf[PATH_MAX];
+      uschar buf[PATH_MAX];
       int offset = 0;
       int size = 0;
 
-      if (getcwd(buf, PATH_MAX) == NULL)
+      if (os_getcwd(buf, PATH_MAX) == NULL)
         {
         perror("exim: getcwd");
         exit(EXIT_FAILURE);
index a4c03664238796ee5ef37a22fee7e652e280ac68..cbd09c00c3069739ef85ddec2cedf156b052ad50 100644 (file)
@@ -1551,7 +1551,7 @@ if (continue_hostname == NULL)
     uschar * msg = NULL;
     if (sx->verify)
       {
-      msg = strerror(errno);
+      msg = US strerror(errno);
       HDEBUG(D_verify) debug_printf("connect: %s\n", msg);
       }
     set_errno_nohost(sx->addrlist,