The Samba-Bugzilla – Attachment 3467 Details for
Bug 5686
libsmbclient segfaults with more than one SMBCCTX
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
look (text/plain), 6.37 KB, created by
Jeremy Allison
on 2008-08-12 15:32:24 UTC
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2008-08-12 15:32:24 UTC
Size:
6.37 KB
patch
obsolete
>diff --git a/examples/libsmbclient/Makefile b/examples/libsmbclient/Makefile >index dabc8e9..e6afdeb 100644 >--- a/examples/libsmbclient/Makefile >+++ b/examples/libsmbclient/Makefile >@@ -94,6 +94,10 @@ testwrite: testwrite.o > @echo Linking testwrite > $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBSMBCLIENT) -lpopt > >+testctx: testctx.o >+ @echo Linking testctx >+ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBSMBCLIENT) -lpopt >+ > smbsh: > make -C smbwrapper > >diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c >index 81b7238..cea234f 100644 >--- a/source/lib/charcnv.c >+++ b/source/lib/charcnv.c >@@ -47,6 +47,7 @@ char lp_failed_convert_char(void) > > static smb_iconv_t conv_handles[NUM_CHARSETS][NUM_CHARSETS]; > static bool conv_silent; /* Should we do a debug if the conversion fails ? */ >+static bool initialized; > > /** > * Return the name of a charset to give to iconv(). >@@ -92,12 +93,10 @@ static const char *charset_name(charset_t ch) > > void lazy_initialize_conv(void) > { >- static int initialized = False; >- > if (!initialized) { >- initialized = True; > load_case_tables(); > init_iconv(); >+ initialized = true; > } > } > >@@ -116,6 +115,7 @@ void gfree_charcnv(void) > } > } > } >+ initialized = false; > } > > /** >diff --git a/source/lib/debug.c b/source/lib/debug.c >index 2ded6bd..d835ea7 100644 >--- a/source/lib/debug.c >+++ b/source/lib/debug.c >@@ -94,7 +94,7 @@ static TALLOC_CTX *tmp_debug_ctx; > > /* > * This is to allow assignment to DEBUGLEVEL before the debug >- * system has been initialised. >+ * system has been initialized. > */ > static int debug_all_class_hack = 1; > static bool debug_all_class_isset_hack = True; >@@ -183,6 +183,8 @@ static char **classname_table = NULL; > Free memory pointed to by global pointers. > ****************************************************************************/ > >+static bool initialized; >+ > void gfree_debugsyms(void) > { > int i; >@@ -194,13 +196,23 @@ void gfree_debugsyms(void) > SAFE_FREE( classname_table ); > } > >- if ( DEBUGLEVEL_CLASS != &debug_all_class_hack ) >+ if ( DEBUGLEVEL_CLASS != &debug_all_class_hack ) { > SAFE_FREE( DEBUGLEVEL_CLASS ); >+ DEBUGLEVEL_CLASS = &debug_all_class_hack; >+ } > >- if ( DEBUGLEVEL_CLASS_ISSET != &debug_all_class_isset_hack ) >+ if ( DEBUGLEVEL_CLASS_ISSET != &debug_all_class_isset_hack ) { > SAFE_FREE( DEBUGLEVEL_CLASS_ISSET ); >+ DEBUGLEVEL_CLASS_ISSET = &debug_all_class_isset_hack; >+ } > > SAFE_FREE(format_bufr); >+ >+ debug_num_classes = 0; >+ >+ debug_level = DEBUGLEVEL_CLASS; >+ >+ initialized = false; > } > > /**************************************************************************** >@@ -530,13 +542,12 @@ Init debugging (one time stuff) > > void debug_init(void) > { >- static bool initialised = False; > const char **p; > >- if (initialised) >+ if (initialized) > return; > >- initialised = True; >+ initialized = true; > > for(p = default_classname_table; *p; p++) { > debug_add_class(*p); >diff --git a/source/lib/util.c b/source/lib/util.c >index 0a32f0f..dafaf03 100644 >--- a/source/lib/util.c >+++ b/source/lib/util.c >@@ -191,12 +191,9 @@ void gfree_all( void ) > gfree_names(); > gfree_loadparm(); > gfree_case_tables(); >- gfree_debugsyms(); > gfree_charcnv(); > gfree_interfaces(); >- >- /* release the talloc null_context memory last */ >- talloc_disable_null_tracking(); >+ gfree_debugsyms(); > } > > const char *my_netbios_names(int i) >diff --git a/source/lib/util_unistr.c b/source/lib/util_unistr.c >index 84ee673..5b769df 100644 >--- a/source/lib/util_unistr.c >+++ b/source/lib/util_unistr.c >@@ -33,6 +33,7 @@ static uint8 *valid_table; > static bool upcase_table_use_unmap; > static bool lowcase_table_use_unmap; > static bool valid_table_use_unmap; >+static bool initialized; > > /** > * Destroy global objects allocated by load_case_tables() >@@ -59,6 +60,7 @@ void gfree_case_tables(void) > else > SAFE_FREE(valid_table); > } >+ initialized = false; > } > > /** >@@ -70,15 +72,14 @@ void gfree_case_tables(void) > > void load_case_tables(void) > { >- static int initialised; > char *old_locale = NULL, *saved_locale = NULL; > int i; > TALLOC_CTX *frame = NULL; > >- if (initialised) { >+ if (initialized) { > return; > } >- initialised = 1; >+ initialized = true; > > frame = talloc_stackframe(); > >diff --git a/source/libsmb/libsmb_context.c b/source/libsmb/libsmb_context.c >index 85de44e..5e075d1 100644 >--- a/source/libsmb/libsmb_context.c >+++ b/source/libsmb/libsmb_context.c >@@ -30,9 +30,8 @@ > /* > * Is the logging working / configfile read ? > */ >-static int SMBC_initialized = 0; >- >- >+static bool SMBC_initialized; >+static unsigned int initialized_ctx_count; > > /* > * Get a new empty handle to fill in with your own info >@@ -201,22 +200,19 @@ smbc_free_context(SMBCCTX *context, > > DEBUG(3, ("Context %p successfully freed\n", context)); > >- gfree_names(); >- gfree_loadparm(); >- gfree_case_tables(); >- gfree_charcnv(); >- gfree_interfaces(); >- >- gencache_shutdown(); >- secrets_shutdown(); >- >- /* release the talloc null_context memory last */ >- talloc_disable_null_tracking(); >+ SAFE_FREE(context->internal); >+ SAFE_FREE(context); > >- gfree_debugsyms(); >+ if (initialized_ctx_count) { >+ initialized_ctx_count--; >+ } > >- SAFE_FREE(context->internal); >- SAFE_FREE(context); >+ if (initialized_ctx_count == 0 && SMBC_initialized) { >+ gencache_shutdown(); >+ secrets_shutdown(); >+ gfree_all(); >+ SMBC_initialized = false; >+ } > return 0; > } > >@@ -427,9 +423,6 @@ smbc_init_context(SMBCCTX *context) > char *user = NULL; > char *home = NULL; > >- /* track talloc null_context memory */ >- talloc_enable_null_tracking(); >- > if (!context) { > errno = EBADF; > return NULL; >@@ -527,7 +520,7 @@ smbc_init_context(SMBCCTX *context) > BlockSignals(True, SIGPIPE); > > /* Done with one-time initialisation */ >- SMBC_initialized = 1; >+ SMBC_initialized = true; > > TALLOC_FREE(frame); > } >@@ -616,7 +609,8 @@ smbc_init_context(SMBCCTX *context) > */ > > context->internal->initialized = True; >- >+ initialized_ctx_count++; >+ > return context; > } > >diff --git a/source/param/loadparm.c b/source/param/loadparm.c >index 14939fb..c894b7f 100644 >--- a/source/param/loadparm.c >+++ b/source/param/loadparm.c >@@ -8682,6 +8682,7 @@ void gfree_loadparm(void) > SAFE_FREE( f ); > f = next; > } >+ file_lists = NULL; > > /* Free resources allocated to services */ >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 5686
: 3467