mirror of
https://github.com/samba-team/samba.git
synced 2025-12-02 00:23:50 +03:00
r18996: merge from samba4:
- fix bug 4078 - 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
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
372471cbad
commit
f5b0924f97
@@ -82,7 +82,7 @@
|
|||||||
NULL
|
NULL
|
||||||
*/
|
*/
|
||||||
static void *null_context;
|
static void *null_context;
|
||||||
static void *cleanup_context;
|
static void *autofree_context;
|
||||||
|
|
||||||
struct talloc_reference_handle {
|
struct talloc_reference_handle {
|
||||||
struct talloc_reference_handle *next, *prev;
|
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)
|
static void talloc_autofree(void)
|
||||||
{
|
{
|
||||||
talloc_free(cleanup_context);
|
talloc_free(autofree_context);
|
||||||
cleanup_context = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1220,11 +1225,12 @@ static void talloc_autofree(void)
|
|||||||
*/
|
*/
|
||||||
void *talloc_autofree_context(void)
|
void *talloc_autofree_context(void)
|
||||||
{
|
{
|
||||||
if (cleanup_context == NULL) {
|
if (autofree_context == NULL) {
|
||||||
cleanup_context = talloc_named_const(NULL, 0, "autofree_context");
|
autofree_context = talloc_named_const(NULL, 0, "autofree_context");
|
||||||
|
talloc_set_destructor(autofree_context, talloc_autofree_destructor);
|
||||||
atexit(talloc_autofree);
|
atexit(talloc_autofree);
|
||||||
}
|
}
|
||||||
return cleanup_context;
|
return autofree_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t talloc_get_size(const void *context)
|
size_t talloc_get_size(const void *context)
|
||||||
|
|||||||
@@ -24,10 +24,6 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
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 "replace.h"
|
||||||
#include "system/time.h"
|
#include "system/time.h"
|
||||||
#include "talloc.h"
|
#include "talloc.h"
|
||||||
@@ -48,7 +44,7 @@ static double timeval_elapsed(struct timeval *tv)
|
|||||||
(tv2.tv_usec - tv->tv_usec)*1.0e-6;
|
(tv2.tv_usec - tv->tv_usec)*1.0e-6;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SAMBA_VERSION_MAJOR==3
|
#if _SAMBA_BUILD_==3
|
||||||
#ifdef malloc
|
#ifdef malloc
|
||||||
#undef malloc
|
#undef malloc
|
||||||
#endif
|
#endif
|
||||||
@@ -1040,6 +1036,28 @@ static bool test_talloc_ptrtype(void)
|
|||||||
return ret;
|
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 torture_local_talloc(struct torture_context *torture)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
@@ -1067,13 +1085,14 @@ bool torture_local_talloc(struct torture_context *torture)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
ret &= test_speed();
|
ret &= test_speed();
|
||||||
}
|
}
|
||||||
|
ret &= test_autofree();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9))
|
#if _SAMBA_BUILD_<4
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
if (!torture_local_talloc(NULL)) {
|
if (!torture_local_talloc(NULL)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user