Browse Source

Merge commit '13298d90a90dc62d21d38f910171c9b57a8f0273'

Nick Mathewson 9 years ago
parent
commit
6f87aa3371

+ 10 - 0
changes/spurious-clang-warnings

@@ -0,0 +1,10 @@
+  o Minor bugfixes:
+    - Silence clang warnings under --enable-expensive-hardening, including:
+        + implicit truncation of 64 bit values to 32 bit;
+        + const char assignment to self;
+        + tautological compare; and
+        + additional parentheses around equality tests. (gcc uses these to
+          silence assignment, so clang warns when they're present in an
+          equality test. But we need to use extra parentheses in macros to
+          isolate them from other code).
+      Fixes bug 13577.

+ 5 - 4
src/common/compat.c

@@ -138,9 +138,10 @@ int
 tor_open_cloexec(const char *path, int flags, unsigned mode)
 {
   int fd;
+  const char *p = path;
 #ifdef O_CLOEXEC
-  path = sandbox_intern_string(path);
-  fd = open(path, flags|O_CLOEXEC, mode);
+  p = sandbox_intern_string(path);
+  fd = open(p, flags|O_CLOEXEC, mode);
   if (fd >= 0)
     return fd;
   /* If we got an error, see if it is EINVAL. EINVAL might indicate that,
@@ -150,8 +151,8 @@ tor_open_cloexec(const char *path, int flags, unsigned mode)
     return -1;
 #endif
 
-  log_debug(LD_FS, "Opening %s with flags %x", path, flags);
-  fd = open(path, flags, mode);
+  log_debug(LD_FS, "Opening %s with flags %x", p, flags);
+  fd = open(p, flags, mode);
 #ifdef FD_CLOEXEC
   if (fd >= 0) {
     if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {

+ 5 - 4
src/common/compat.h

@@ -562,17 +562,18 @@ const char *tor_socket_strerror(int e);
 #else
 #define SOCK_ERRNO(e) e
 #if EAGAIN == EWOULDBLOCK
-#define ERRNO_IS_EAGAIN(e)           ((e) == EAGAIN)
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define ERRNO_IS_EAGAIN(e)           ((e) == EAGAIN || 0)
 #else
 #define ERRNO_IS_EAGAIN(e)           ((e) == EAGAIN || (e) == EWOULDBLOCK)
 #endif
-#define ERRNO_IS_EINPROGRESS(e)      ((e) == EINPROGRESS)
-#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS)
+#define ERRNO_IS_EINPROGRESS(e)      ((e) == EINPROGRESS || 0)
+#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS || 0)
 #define ERRNO_IS_ACCEPT_EAGAIN(e) \
   (ERRNO_IS_EAGAIN(e) || (e) == ECONNABORTED)
 #define ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e) \
   ((e) == EMFILE || (e) == ENFILE || (e) == ENOBUFS || (e) == ENOMEM)
-#define ERRNO_IS_EADDRINUSE(e)       ((e) == EADDRINUSE)
+#define ERRNO_IS_EADDRINUSE(e)       (((e) == EADDRINUSE) || 0)
 #define tor_socket_errno(sock)       (errno)
 #define tor_socket_strerror(e)       strerror(e)
 #endif

+ 1 - 1
src/common/crypto_pwbox.c

@@ -62,7 +62,7 @@ crypto_pwbox(uint8_t **out, size_t *outlen_out,
   pwbox_encoded_setlen_data(enc, encrypted_len);
   encrypted_portion = pwbox_encoded_getarray_data(enc);
 
-  set_uint32(encrypted_portion, htonl(input_len));
+  set_uint32(encrypted_portion, htonl((uint32_t)input_len));
   memcpy(encrypted_portion+4, input, input_len);
 
   /* Now that all the data is in position, derive some keys, encrypt, and

+ 2 - 1
src/ext/ht.h

@@ -38,8 +38,9 @@
   }
 #endif
 
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
 #define HT_EMPTY(head)                          \
-  ((head)->hth_n_entries == 0)
+  (((head)->hth_n_entries == 0) || 0)
 
 /* How many elements in 'head'? */
 #define HT_SIZE(head)                           \

+ 15 - 8
src/ext/tor_queue.h

@@ -109,7 +109,8 @@ struct {								\
  */
 #define	TOR_SLIST_FIRST(head)	((head)->slh_first)
 #define	TOR_SLIST_END(head)		NULL
-#define	TOR_SLIST_EMPTY(head)	(SLIST_FIRST(head) == TOR_SLIST_END(head))
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define	TOR_SLIST_EMPTY(head)	((SLIST_FIRST(head) == TOR_SLIST_END(head)) || 0)
 #define	TOR_SLIST_NEXT(elm, field)	((elm)->field.sle_next)
 
 #define	TOR_SLIST_FOREACH(var, head, field)					\
@@ -181,9 +182,11 @@ struct {								\
 /*
  * List access methods
  */
-#define	TOR_LIST_FIRST(head)		((head)->lh_first)
-#define	TOR_LIST_END(head)			NULL
-#define	TOR_LIST_EMPTY(head)		(TOR_LIST_FIRST(head) == TOR_LIST_END(head))
+#define	TOR_LIST_FIRST(head)    ((head)->lh_first)
+#define	TOR_LIST_END(head)		  NULL
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define	TOR_LIST_EMPTY(head)	  \
+          ((TOR_LIST_FIRST(head) == TOR_LIST_END(head)) || 0)
 #define	TOR_LIST_NEXT(elm, field)		((elm)->field.le_next)
 
 #define TOR_LIST_FOREACH(var, head, field)					\
@@ -265,8 +268,10 @@ struct {								\
  * Simple queue access methods.
  */
 #define	TOR_SIMPLEQ_FIRST(head)	    ((head)->sqh_first)
-#define	TOR_SIMPLEQ_END(head)	    NULL
-#define	TOR_SIMPLEQ_EMPTY(head)	    (TOR_SIMPLEQ_FIRST(head) == TOR_SIMPLEQ_END(head))
+#define	TOR_SIMPLEQ_END(head)	      NULL
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define	TOR_SIMPLEQ_EMPTY(head)	    \
+          ((TOR_SIMPLEQ_FIRST(head) == TOR_SIMPLEQ_END(head)) || 0)
 #define	TOR_SIMPLEQ_NEXT(elm, field)    ((elm)->field.sqe_next)
 
 #define TOR_SIMPLEQ_FOREACH(var, head, field)				\
@@ -345,8 +350,9 @@ struct {								\
 /* XXX */
 #define TOR_TAILQ_PREV(elm, headname, field)				\
 	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
 #define	TOR_TAILQ_EMPTY(head)						\
-	(TOR_TAILQ_FIRST(head) == TOR_TAILQ_END(head))
+	((TOR_TAILQ_FIRST(head) == TOR_TAILQ_END(head)) || 0)
 
 #define TOR_TAILQ_FOREACH(var, head, field)					\
 	for((var) = TOR_TAILQ_FIRST(head);					\
@@ -462,8 +468,9 @@ struct {								\
 #define	TOR_CIRCLEQ_END(head)		((void *)(head))
 #define	TOR_CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)
 #define	TOR_CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
 #define	TOR_CIRCLEQ_EMPTY(head)						\
-	(TOR_CIRCLEQ_FIRST(head) == TOR_CIRCLEQ_END(head))
+	((TOR_CIRCLEQ_FIRST(head) == TOR_CIRCLEQ_END(head)) || 0)
 
 #define TOR_CIRCLEQ_FOREACH(var, head, field)				\
 	for((var) = TOR_CIRCLEQ_FIRST(head);				\

+ 2 - 2
src/or/channeltls.c

@@ -847,8 +847,8 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan,
   tor_assert(conn);
   tor_assert(conn->chan == chan);
   tor_assert(chan->conn == conn);
-  /* -Werror appeasement */
-  tor_assert(old_state == old_state);
+  /* Shut the compiler up without triggering -Wtautological-compare */
+  (void)old_state;
 
   base_chan = TLS_CHAN_TO_BASE(chan);
 

+ 2 - 2
src/or/circuitmux_ewma.c

@@ -273,8 +273,8 @@ ewma_alloc_circ_data(circuitmux_t *cmux,
   tor_assert(circ);
   tor_assert(direction == CELL_DIRECTION_OUT ||
              direction == CELL_DIRECTION_IN);
-  /* Shut the compiler up */
-  tor_assert(cell_count == cell_count);
+  /* Shut the compiler up without triggering -Wtautological-compare */
+  (void)cell_count;
 
   cdata = tor_malloc_zero(sizeof(*cdata));
   cdata->base_.magic = EWMA_POL_CIRC_DATA_MAGIC;

+ 2 - 1
src/or/connection.h

@@ -189,7 +189,8 @@ dir_connection_t *connection_dir_get_by_purpose_and_resource(
 
 int any_other_active_or_conns(const or_connection_t *this_conn);
 
-#define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define connection_speaks_cells(conn) (((conn)->type == CONN_TYPE_OR) || 0)
 int connection_is_listener(connection_t *conn);
 int connection_state_is_open(connection_t *conn);
 int connection_state_is_connecting(connection_t *conn);

+ 3 - 2
src/or/or.h

@@ -241,7 +241,7 @@ typedef enum {
 #define PROXY_CONNECT 1
 #define PROXY_SOCKS4 2
 #define PROXY_SOCKS5 3
-/* !!!! If there is ever a PROXY_* type over 2, we must grow the proxy_type
+/* !!!! If there is ever a PROXY_* type over 3, we must grow the proxy_type
  * field in or_connection_t */
 
 /* Pluggable transport proxy type. Don't use this in or_connection_t,
@@ -4317,7 +4317,8 @@ static INLINE void or_state_mark_dirty(or_state_t *state, time_t when)
 /** Please turn this IP address into an FQDN, privately. */
 #define SOCKS_COMMAND_RESOLVE_PTR   0xF1
 
-#define SOCKS_COMMAND_IS_CONNECT(c) ((c)==SOCKS_COMMAND_CONNECT)
+/* || 0 is for -Wparentheses-equality (-Wall?) appeasement under clang */
+#define SOCKS_COMMAND_IS_CONNECT(c) (((c)==SOCKS_COMMAND_CONNECT) || 0)
 #define SOCKS_COMMAND_IS_RESOLVE(c) ((c)==SOCKS_COMMAND_RESOLVE || \
                                      (c)==SOCKS_COMMAND_RESOLVE_PTR)