[SCM] Samba Shared Repository - branch master updated

Rusty Russell rusty at samba.org
Thu Mar 29 00:19:03 MDT 2012


The branch, master has been updated
       via  f74ae32 cast: make sure suncc sees a constant.
       via  be25ab9 cast: test/compile_fail-cast_static.c should fail without COMPOUND_LITERALS.
       via  3acce70 tdb2: fix prototype in tdb1 code.
      from  e36622f s4-upgradedns: Make sure the attribute exists before accessing it

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f74ae3257a2edb9756d9f0442c1314306e936759
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Thu Mar 29 14:58:33 2012 +1030

    cast: make sure suncc sees a constant.
    
    cast_const() et. al. are supposed to be a constant expression, so you can do things like:
    	static char *p = cast_const(char *, (const char *)"hello");
    
    Unfortunately, a cast to intptr_t and arithmetic makes suncc reject it as
    a constant expression.  We need the cast, because (1) the expression could be
    a void *, so we can't just add to it, and (2) gcc complains with -Wcast-qual
    without it.
    
    So instead of adding BUILD_BUG_OR_ZERO, we use a ? :, which keeps everyone happy.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
    (Imported from CCAN commit 74859ab18b10aaf990848e49d7789ff5c6cf96c6)
    
    Autobuild-User: Rusty Russell <rusty at rustcorp.com.au>
    Autobuild-Date: Thu Mar 29 08:18:57 CEST 2012 on sn-devel-104

commit be25ab9c8df2f96ee10929fdfee582935b2f0e06
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Tue Mar 27 15:40:45 2012 +1030

    cast: test/compile_fail-cast_static.c should fail without COMPOUND_LITERALS.
    
    It still gave a warning on gcc, because casting a char to a char* gives a warning.  Not so on sun CC.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
    (Imported from CCAN commit 6569a707d169a629e25e10710c760c8dc84525c7)

commit 3acce707a32a28c309133583b8cd1a554f19a8b3
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Mon Mar 26 14:33:17 2012 +1030

    tdb2: fix prototype in tdb1 code.
    
    We were handing an int-returning function where we should hand an enum TDB_ERROR
    returning function.  Worse, it was returning 0/-1 instead of 0/TDB_ERR_*.
    
    Fortunately, it's only compared against success, but the Solaris compiler
    warns about it, and it's not correct anyway.
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>

-----------------------------------------------------------------------

Summary of changes:
 lib/ccan/cast/cast.h                          |   20 ++++++++++++--------
 lib/ccan/cast/test/compile_fail-cast_static.c |   12 +++++++++---
 lib/ccan/cast/test/compile_ok-static.c        |   10 ++++++++++
 lib/tdb2/tdb1_tdb.c                           |   10 +++++-----
 4 files changed, 36 insertions(+), 16 deletions(-)
 create mode 100644 lib/ccan/cast/test/compile_ok-static.c


Changeset truncated at 500 lines:

diff --git a/lib/ccan/cast/cast.h b/lib/ccan/cast/cast.h
index b108b0c..1f3a7aa 100644
--- a/lib/ccan/cast/cast.h
+++ b/lib/ccan/cast/cast.h
@@ -15,8 +15,8 @@
  * only differs in signed/unsigned, not in type or const-ness.
  */
 #define cast_signed(type, expr)						\
-	((type)(expr)							\
-	 + BUILD_ASSERT_OR_ZERO(cast_sign_compatible(type, (expr))))
+	(0 ? BUILD_ASSERT_OR_ZERO(cast_sign_compatible(type, (expr))) :	\
+	 (type)(expr))
 
 /**
  * cast_const - remove a const qualifier from a pointer.
@@ -26,6 +26,10 @@
  * This ensures that you are only removing the const qualifier from an
  * expression.  The expression must otherwise match @type.
  *
+ * We cast via intptr_t to suppress gcc's -Wcast-qual (which SAMBA
+ * uses), and via the ? : so Sun CC doesn't complain about the result
+ * not being constant.
+ *
  * If @type is a pointer to a pointer, you must use cast_const2 (etc).
  *
  * Example:
@@ -40,8 +44,8 @@
  *	}
  */
 #define cast_const(type, expr)						\
-	((type)((intptr_t)(expr)					\
-		+ BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type))))
+        (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat1((expr), type)) :   \
+         (type)(intptr_t)(expr))
 
 /**
  * cast_const2 - remove a const qualifier from a pointer to a pointer.
@@ -52,8 +56,8 @@
  * expression.  The expression must otherwise match @type.
  */
 #define cast_const2(type, expr)						\
-	((type)((intptr_t)(expr)					\
-		+ BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type))))
+        (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat2((expr), type)) :   \
+	 (type)(intptr_t)(expr))
 
 /**
  * cast_const3 - remove a const from a pointer to a pointer to a pointer..
@@ -64,8 +68,8 @@
  * expression.  The expression must otherwise match @type.
  */
 #define cast_const3(type, expr)						\
-	((type)((intptr_t)(expr)					\
-		+ BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type))))
+        (0 ? BUILD_ASSERT_OR_ZERO(cast_const_compat3((expr), type)) :   \
+	 (type)(intptr_t)(expr))
 
 
 /**
diff --git a/lib/ccan/cast/test/compile_fail-cast_static.c b/lib/ccan/cast/test/compile_fail-cast_static.c
index 0f9e478..a4ebf61 100644
--- a/lib/ccan/cast/test/compile_fail-cast_static.c
+++ b/lib/ccan/cast/test/compile_fail-cast_static.c
@@ -3,15 +3,21 @@
 
 int main(int argc, char *argv[])
 {
-	char c;
+	long c;
 #ifdef FAIL
 	char *
 #else
-	long
+	char
 #endif
 		x = 0;
 
-	c = cast_static(char, x);
+	c = cast_static(long, x);
 	(void) c; /* Suppress unused-but-set-variable warning. */
 	return 0;
 }
+
+#ifdef FAIL
+#if !HAVE_COMPOUND_LITERALS
+#error "Unfortunately we don't fail if cast_static without compound literals"
+#endif
+#endif
diff --git a/lib/ccan/cast/test/compile_ok-static.c b/lib/ccan/cast/test/compile_ok-static.c
new file mode 100644
index 0000000..98b667e
--- /dev/null
+++ b/lib/ccan/cast/test/compile_ok-static.c
@@ -0,0 +1,10 @@
+/* OpenIndiana's CC (aka suncc) has issues with constants: make sure
+ * we are one! */
+#include <ccan/cast/cast.h>
+
+static char *p = cast_const(char *, (const char *)"hello");
+
+int main(int argc, char *argv[])
+{
+	return p[0] == argv[0][0];
+}
diff --git a/lib/tdb2/tdb1_tdb.c b/lib/tdb2/tdb1_tdb.c
index 869672a..ae633ed 100644
--- a/lib/tdb2/tdb1_tdb.c
+++ b/lib/tdb2/tdb1_tdb.c
@@ -146,17 +146,17 @@ tdb1_off_t tdb1_find_lock_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t h
 
 static TDB_DATA _tdb1_fetch(struct tdb_context *tdb, TDB_DATA key);
 
-static int tdb_update_hash_cmp(TDB_DATA key, TDB_DATA data, void *private_data)
+static enum TDB_ERROR tdb_update_hash_cmp(TDB_DATA key, TDB_DATA data, void *private_data)
 {
 	TDB_DATA *dbuf = (TDB_DATA *)private_data;
 
 	if (dbuf->dsize != data.dsize) {
-		return -1;
+		return TDB_ERR_EINVAL;
 	}
 	if (memcmp(dbuf->dptr, data.dptr, data.dsize) != 0) {
-		return -1;
+		return TDB_ERR_EINVAL;
 	}
-	return 0;
+	return TDB_SUCCESS;
 }
 
 /* update an entry in place - this only works if the new data size
@@ -177,7 +177,7 @@ static int tdb1_update_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash
 	if (rec.key_len == key.dsize &&
 	    rec.data_len == dbuf.dsize &&
 	    rec.full_hash == hash &&
-	    tdb1_parse_record(tdb, key, tdb_update_hash_cmp, &dbuf) == 0) {
+	    tdb1_parse_record(tdb, key, tdb_update_hash_cmp, &dbuf) == TDB_SUCCESS) {
 			return 0;
 	}
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list