r18995: - fix bug 4078
authorStefan Metzmacher <metze@samba.org>
Fri, 29 Sep 2006 10:50:12 +0000 (10:50 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:20:27 +0000 (14:20 -0500)
- talloc_free(talloc_autofree_context()); should not result
  in a SIGABORT on exit
- add a test for this, but this test can also pass in the standalone build
  and samba3, as samba4 uses talloc_autofree_context()

metze

source/lib/talloc/talloc.c
source/lib/talloc/testsuite.c

index 58028a85b8cd05e88f65ff10be9d896fe2249c0b..15b27c61ee280e18746002ed053f9b6c0ad1a4d5 100644 (file)
@@ -82,7 +82,7 @@
    NULL
 */
 static void *null_context;
-static void *cleanup_context;
+static void *autofree_context;
 
 struct talloc_reference_handle {
        struct talloc_reference_handle *next, *prev;
@@ -1208,10 +1208,15 @@ void *talloc_realloc_fn(const void *context, void *ptr, size_t size)
 }
 
 
+static int talloc_autofree_destructor(void *ptr)
+{
+       autofree_context = NULL;
+       return 0;
+}
+
 static void talloc_autofree(void)
 {
-       talloc_free(cleanup_context);
-       cleanup_context = NULL;
+       talloc_free(autofree_context);
 }
 
 /*
@@ -1220,11 +1225,12 @@ static void talloc_autofree(void)
 */
 void *talloc_autofree_context(void)
 {
-       if (cleanup_context == NULL) {
-               cleanup_context = talloc_named_const(NULL, 0, "autofree_context");
+       if (autofree_context == NULL) {
+               autofree_context = talloc_named_const(NULL, 0, "autofree_context");
+               talloc_set_destructor(autofree_context, talloc_autofree_destructor);
                atexit(talloc_autofree);
        }
-       return cleanup_context;
+       return autofree_context;
 }
 
 size_t talloc_get_size(const void *context)
index 00ea212e58f145b6b00ca654422a43bc49b7814b..70ee35cbef66a083e86caabd4284715308297e67 100644 (file)
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
-#ifdef _SAMBA_BUILD_
-#include "version.h"
-#endif /* _SAMBA_BUILD_ */
-
 #include "replace.h"
 #include "system/time.h"
 #include "talloc.h"
@@ -48,7 +44,7 @@ static double timeval_elapsed(struct timeval *tv)
               (tv2.tv_usec - tv->tv_usec)*1.0e-6;
 }
 
-#if SAMBA_VERSION_MAJOR==3
+#if _SAMBA_BUILD_==3
 #ifdef malloc
 #undef malloc
 #endif
@@ -1040,6 +1036,28 @@ static bool test_talloc_ptrtype(void)
        return ret;
 }
 
+static bool test_autofree(void)
+{
+#if _SAMBA_BUILD_>=4
+       /* 
+        * we can't run this inside smbtorture in samba4
+        * as smbtorture uses talloc_autofree_context()
+        */
+       printf("SKIPPING TALLOC AUTOFREE CONTEXT (not supported from smbtorture)\n");
+#else
+       void *p;
+
+       printf("TESTING TALLOC AUTOFREE CONTEXT\n");
+
+       p = talloc_autofree_context();
+       talloc_free(p);
+
+       p = talloc_autofree_context();
+       talloc_free(p);
+#endif
+       return true;
+}
+
 bool torture_local_talloc(struct torture_context *torture) 
 {
        bool ret = true;
@@ -1067,13 +1085,14 @@ bool torture_local_talloc(struct torture_context *torture)
        if (ret) {
                ret &= test_speed();
        }
+       ret &= test_autofree();
 
        return ret;
 }
 
 
 
-#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9))
+#if _SAMBA_BUILD_<4
  int main(void)
 {
        if (!torture_local_talloc(NULL)) {