diff options
author | Andrew Tridgell <tridge@samba.org> | 2010-03-18 14:06:13 +1100 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2010-03-18 14:18:41 +1100 |
commit | 55c45110e6994fe95867f4df3243c6829116e093 (patch) | |
tree | 246cee1b14d0ecf49bb8f105ee53b3d2e9eedf16 /librpc | |
parent | 752b2206cbb411e98e88efcfd1df9876a79d4a3d (diff) | |
download | samba-55c45110e6994fe95867f4df3243c6829116e093.tar.gz samba-55c45110e6994fe95867f4df3243c6829116e093.tar.bz2 samba-55c45110e6994fe95867f4df3243c6829116e093.zip |
charset: fixed a problem with the global use of the iconv_convenience structure
We had a crash bug where a cached copy of a iconv convenience pointer
was used after being freed when loadparm asked for iconv to
reload. This could happen if a python module used a iconv based
function before loadparm was completed.
The fix is to ensure that any use of this pointer remains valid, by
reusing the pointer itself when it has already been initialised, but
filling in the child elements with the updated values.
Diffstat (limited to 'librpc')
-rw-r--r-- | librpc/ndr/ndr.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 4d763e0ead..90be787526 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -260,7 +260,8 @@ _PUBLIC_ void ndr_print_function_debug(ndr_print_function_t fn, const char *name * this all the way down */ #if _SAMBA_BUILD_ == 4 - ndr->iconv_convenience = smb_iconv_convenience_init(talloc_autofree_context(), "ASCII", "UTF-8", true); + ndr->iconv_convenience = smb_iconv_convenience_reinit(talloc_autofree_context(), + "ASCII", "UTF-8", true, NULL); #endif fn(ndr, name, flags, ptr); @@ -289,7 +290,8 @@ _PUBLIC_ char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, c * this all the way down */ #if _SAMBA_BUILD_ == 4 - ndr->iconv_convenience = smb_iconv_convenience_init(talloc_autofree_context(), "ASCII", "UTF-8", true); + ndr->iconv_convenience = smb_iconv_convenience_reinit(talloc_autofree_context(), + "ASCII", "UTF-8", true, NULL); #endif fn(ndr, name, ptr); |