The branch, master has been updated via 76b351e s3:smbd: Fix incorrect use of sys_getgroups() via 60af864 s3:lib: Fix incorrect logic in sys_broken_getgroups() via 600f878 lib: debug: Avoid negative array access. via bf8f7a3 lib:charset: Remove use of talloc_autofree_context() for global_iconv_handle via 35b2371 lib:charset: Make global_iconv_handle private via 2a4d07b lib: param: Remove the last external use of global_iconv_handle by calling the utility function reinit_iconv_handle(). via 766e9ff lib: param: Use utility functions to get rid of two more uses of global_iconv_handle. via 6086b0e s3:param: Use new utility function to hide use of global_iconv_handle via b4e4042 s3:lib:charcnv: Remove use of global global_iconv_handle via c28e2c9 lib:charset: Add utility functions reinit_iconv_handle() and free_iconv_handle(void) via 3afbdb7 lib: Remove smb_iconv_handle_reinit_lp() from 05d83cc vfs_acl_xattr: avoid needlessly supplying a large buffer to getxattr()
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 76b351e907f67cc7d4af4e7d800c7a3aa1269ee8 Author: Jeremy Allison <j...@samba.org> Date: Mon Apr 17 14:30:54 2017 -0700 s3:smbd: Fix incorrect use of sys_getgroups() Second arg must be NULL when first arg is 0 (it is in all other places). Bug report and patch from Hanno Böck <ha...@hboeck.de> BUG: https://bugzilla.samba.org/show_bug.cgi?id=12747 Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Andreas Schneider <a...@cryptomilk.org> Autobuild-Date(master): Tue Apr 18 15:43:02 CEST 2017 on sn-devel-144 commit 60af864f751706c48b8af448700bf06e33e45946 Author: Jeremy Allison <j...@samba.org> Date: Mon Apr 17 14:30:04 2017 -0700 s3:lib: Fix incorrect logic in sys_broken_getgroups() If setlen == 0 then the second argument must be ignored. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12747 Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 600f8787e3b605c9f3e8f724c726e63157ee9efc Author: Jeremy Allison <j...@samba.org> Date: Mon Apr 17 14:09:24 2017 -0700 lib: debug: Avoid negative array access. Report and patch from Hanno Böck <ha...@hboeck.de>. BUG: https://bugzilla.samba.org/show_bug.cgi?id=12746 Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Andreas Schneider <a...@samba.org> commit bf8f7a36bfbe5c2018dbd9a317c8791c56b4114e Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 16:06:08 2017 -0700 lib:charset: Remove use of talloc_autofree_context() for global_iconv_handle All other callers use NULL here anyway, so there's no need to use a special context for get_iconv_handle(). Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 35b23711e8f59efffa4ae56b3005f0f0fdda2e5e Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 16:05:02 2017 -0700 lib:charset: Make global_iconv_handle private Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 2a4d07b999df2343c694a2b373d3b506bd3d5682 Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:57:28 2017 -0700 lib: param: Remove the last external use of global_iconv_handle by calling the utility function reinit_iconv_handle(). Add an error check. This *looks* like a logic change, but it is not. The only change is the addition of the error return check. The reason is that the changed function, reload_charcnv(), is the *only* function that sets lp_ctx->iconv_handle. And it does so just before setting global_iconv_handle = lp_ctx->iconv_handle. Calling the utility function reinit_iconv_handle() instead merely sets global_iconv_handle first, then assigns it (as the return) to lp_ctx->iconv_handle. So all this is doing is reversing the order of setting global_iconv_handle and lp_ctx->iconv_handle to the same thing. Even the removal of the lines: - struct smb_iconv_handle *old_ic = lp_ctx->iconv_handle - if (old_ic == NULL) { - old_ic = global_iconv_handle; has no effect, as remember that lp_ctx->iconv_handle is only ever set to the same value as global_iconv_handle, and once this function has been run once, lp_ctx->iconv_handle != NULL. This allows us finally to make global_iconv_handle private to the C source file that defines it. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 766e9ff05e0689b0c0284e33e044a363ed4a4709 Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:51:17 2017 -0700 lib: param: Use utility functions to get rid of two more uses of global_iconv_handle. Add error return checking. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 6086b0e5a2ca03ba3a3c16cae2a0fe79605f5a6a Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:47:17 2017 -0700 s3:param: Use new utility function to hide use of global_iconv_handle Add error return check. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit b4e4042b37f94d3c0e2eb4767abda52189f807b4 Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:44:08 2017 -0700 s3:lib:charcnv: Remove use of global global_iconv_handle Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit c28e2c937a6223c49221315384c01074a00161eb Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:42:39 2017 -0700 lib:charset: Add utility functions reinit_iconv_handle() and free_iconv_handle(void) Not yet used. Will enable us to make global_iconv_handle private. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 3afbdb7a0e5c5e4bacc40f80ad0e8981b0af4b88 Author: Jeremy Allison <j...@samba.org> Date: Tue Apr 11 15:31:17 2017 -0700 lib: Remove smb_iconv_handle_reinit_lp() It's merely a wrapper for smb_iconv_handle_reinit(), only used in one place and smb_iconv_handle_reinit() is already called from lib/param/loadparm.c. Removing this will make it easier to make global_iconv_handle private state to lib/util/charset/codepoints.c later. Signed-off-by: Jeremy Allison <j...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/param/loadparm.c | 34 +++++++++++++++++++++------------- lib/param/param.h | 4 ---- lib/param/util.c | 11 ----------- lib/util/charset/charset.h | 6 +++++- lib/util/charset/codepoints.c | 32 ++++++++++++++++++++++++++++---- lib/util/debug.c | 2 +- source3/lib/charcnv.c | 2 +- source3/lib/system.c | 12 +++++++----- source3/param/loadparm.c | 11 ++++++++--- source3/smbd/sec_ctx.c | 3 +-- 10 files changed, 72 insertions(+), 45 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c index 4d21d88..d7287ab 100644 --- a/lib/param/loadparm.c +++ b/lib/param/loadparm.c @@ -1265,10 +1265,14 @@ bool handle_charset(struct loadparm_context *lp_ctx, struct loadparm_service *se { if (lp_ctx->s3_fns) { if (*ptr == NULL || strcmp(*ptr, pszParmValue) != 0) { - global_iconv_handle = smb_iconv_handle_reinit(NULL, - lpcfg_dos_charset(lp_ctx), - lpcfg_unix_charset(lp_ctx), - true, global_iconv_handle); + struct smb_iconv_handle *ret = NULL; + + ret = reinit_iconv_handle(NULL, + lpcfg_dos_charset(lp_ctx), + lpcfg_unix_charset(lp_ctx)); + if (ret == NULL) { + smb_panic("reinit_iconv_handle failed"); + } } } @@ -1303,16 +1307,19 @@ bool handle_dos_charset(struct loadparm_context *lp_ctx, struct loadparm_service } if (*ptr == NULL || strcmp(*ptr, pszParmValue) != 0) { + struct smb_iconv_handle *ret = NULL; if (is_utf8) { DEBUG(0,("ERROR: invalid DOS charset: 'dos charset' must not " "be UTF8, using (default value) %s instead.\n", DEFAULT_DOS_CHARSET)); pszParmValue = DEFAULT_DOS_CHARSET; } - global_iconv_handle = smb_iconv_handle_reinit(NULL, - lpcfg_dos_charset(lp_ctx), - lpcfg_unix_charset(lp_ctx), - true, global_iconv_handle); + ret = reinit_iconv_handle(NULL, + lpcfg_dos_charset(lp_ctx), + lpcfg_unix_charset(lp_ctx)); + if (ret == NULL) { + smb_panic("reinit_iconv_handle failed"); + } } } @@ -3349,16 +3356,17 @@ struct smb_iconv_handle *lpcfg_iconv_handle(struct loadparm_context *lp_ctx) _PUBLIC_ void reload_charcnv(struct loadparm_context *lp_ctx) { - struct smb_iconv_handle *old_ic = lp_ctx->iconv_handle; if (!lp_ctx->global) { return; } - if (old_ic == NULL) { - old_ic = global_iconv_handle; + lp_ctx->iconv_handle = + reinit_iconv_handle(lp_ctx, + lpcfg_dos_charset(lp_ctx), + lpcfg_unix_charset(lp_ctx)); + if (lp_ctx->iconv_handle == NULL) { + smb_panic("reinit_iconv_handle failed"); } - lp_ctx->iconv_handle = smb_iconv_handle_reinit_lp(lp_ctx, lp_ctx, old_ic); - global_iconv_handle = lp_ctx->iconv_handle; } _PUBLIC_ char *lpcfg_tls_keyfile(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx) diff --git a/lib/param/param.h b/lib/param/param.h index e123e67..a6dbafa 100644 --- a/lib/param/param.h +++ b/lib/param/param.h @@ -301,10 +301,6 @@ char *smbd_tmp_path(TALLOC_CTX *mem_ctx, const char *lpcfg_imessaging_path(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx); -struct smb_iconv_handle *smb_iconv_handle_reinit_lp(TALLOC_CTX *mem_ctx, - struct loadparm_context *lp_ctx, - struct smb_iconv_handle *old_ic); - const char *lpcfg_sam_name(struct loadparm_context *lp_ctx); const char *lpcfg_sam_dnsname(struct loadparm_context *lp_ctx); diff --git a/lib/param/util.c b/lib/param/util.c index 233981a..52796562 100644 --- a/lib/param/util.c +++ b/lib/param/util.c @@ -248,17 +248,6 @@ const char *lpcfg_imessaging_path(TALLOC_CTX *mem_ctx, return smbd_tmp_path(mem_ctx, lp_ctx, "msg"); } -struct smb_iconv_handle *smb_iconv_handle_reinit_lp(TALLOC_CTX *mem_ctx, - struct loadparm_context *lp_ctx, - struct smb_iconv_handle *old_ic) -{ - return smb_iconv_handle_reinit(mem_ctx, lpcfg_dos_charset(lp_ctx), - lpcfg_unix_charset(lp_ctx), - true, - old_ic); -} - - const char *lpcfg_sam_name(struct loadparm_context *lp_ctx) { switch (lpcfg_server_role(lp_ctx)) { diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h index ca7a437..ff466c3 100644 --- a/lib/util/charset/charset.h +++ b/lib/util/charset/charset.h @@ -164,12 +164,16 @@ bool convert_string_error(charset_t from, charset_t to, void *dest, size_t destlen, size_t *converted_size); -extern struct smb_iconv_handle *global_iconv_handle; struct smb_iconv_handle *get_iconv_handle(void); struct smb_iconv_handle *get_iconv_testing_handle(TALLOC_CTX *mem_ctx, const char *dos_charset, const char *unix_charset, bool use_builtin_handlers); +struct smb_iconv_handle *reinit_iconv_handle(TALLOC_CTX *mem_ctx, + const char *dos_charset, + const char *unix_charset); +void free_iconv_handle(void); + smb_iconv_t get_conv_handle(struct smb_iconv_handle *ic, charset_t from, charset_t to); const char *charset_name(struct smb_iconv_handle *ic, charset_t ch); diff --git a/lib/util/charset/codepoints.c b/lib/util/charset/codepoints.c index cfb0b27..3f380b9 100644 --- a/lib/util/charset/codepoints.c +++ b/lib/util/charset/codepoints.c @@ -16502,13 +16502,19 @@ struct smb_iconv_handle { smb_iconv_t conv_handles[NUM_CHARSETS][NUM_CHARSETS]; }; -struct smb_iconv_handle *global_iconv_handle = NULL; +static struct smb_iconv_handle *global_iconv_handle = NULL; struct smb_iconv_handle *get_iconv_handle(void) { - if (global_iconv_handle == NULL) - global_iconv_handle = smb_iconv_handle_reinit(talloc_autofree_context(), - "ASCII", "UTF-8", true, NULL); + if (global_iconv_handle == NULL) { + global_iconv_handle = + smb_iconv_handle_reinit(NULL, + "ASCII", + "UTF-8", + true, + NULL); + } + return global_iconv_handle; } @@ -16521,6 +16527,24 @@ struct smb_iconv_handle *get_iconv_testing_handle(TALLOC_CTX *mem_ctx, dos_charset, unix_charset, use_builtin_handlers, NULL); } +struct smb_iconv_handle *reinit_iconv_handle(TALLOC_CTX *mem_ctx, + const char *dos_charset, + const char *unix_charset) +{ + global_iconv_handle = + smb_iconv_handle_reinit(mem_ctx, + dos_charset, + unix_charset, + true, + global_iconv_handle); + return global_iconv_handle; +} + +void free_iconv_handle(void) +{ + TALLOC_FREE(global_iconv_handle); +} + /** * Return the name of a charset to give to iconv(). **/ diff --git a/lib/util/debug.c b/lib/util/debug.c index f48daf6..5abca41 100644 --- a/lib/util/debug.c +++ b/lib/util/debug.c @@ -488,7 +488,7 @@ static void debug_backends_log(const char *msg, int msg_level) * a buffer without the newline character. */ len = MIN(strlen(msg), FORMAT_BUFR_SIZE - 1); - if (msg[len - 1] == '\n') { + if ((len > 0) && (msg[len - 1] == '\n')) { len--; } diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 66a98f9..5ec070c 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -27,7 +27,7 @@ **/ void gfree_charcnv(void) { - TALLOC_FREE(global_iconv_handle); + free_iconv_handle(); } /** diff --git a/source3/lib/system.c b/source3/lib/system.c index 3d3eeed..99462b6 100644 --- a/source3/lib/system.c +++ b/source3/lib/system.c @@ -790,12 +790,11 @@ int groups_max(void) static int sys_broken_getgroups(int setlen, gid_t *gidset) { - GID_T gid; GID_T *group_list; int i, ngroups; if(setlen == 0) { - return getgroups(setlen, &gid); + return getgroups(0, NULL); } /* @@ -808,9 +807,6 @@ static int sys_broken_getgroups(int setlen, gid_t *gidset) return -1; } - if (setlen == 0) - setlen = groups_max(); - if((group_list = SMB_MALLOC_ARRAY(GID_T, setlen)) == NULL) { DEBUG(0,("sys_getgroups: Malloc fail.\n")); return -1; @@ -823,6 +819,12 @@ static int sys_broken_getgroups(int setlen, gid_t *gidset) return -1; } + /* + * We're safe here as if ngroups > setlen then + * getgroups *must* return EINVAL. + * pubs.opengroup.org/onlinepubs/009695399/functions/getgroups.html + */ + for(i = 0; i < ngroups; i++) gidset[i] = (gid_t)group_list[i]; diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index b543a6f..3c597ec 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -2368,9 +2368,14 @@ bool lp_file_list_changed(void) **/ static void init_iconv(void) { - global_iconv_handle = smb_iconv_handle_reinit(NULL, lp_dos_charset(), - lp_unix_charset(), - true, global_iconv_handle); + struct smb_iconv_handle *ret = NULL; + + ret = reinit_iconv_handle(NULL, + lp_dos_charset(), + lp_unix_charset()); + if (ret == NULL) { + smb_panic("reinit_iconv_handle failed"); + } } /*************************************************************************** diff --git a/source3/smbd/sec_ctx.c b/source3/smbd/sec_ctx.c index 33d987f..5e0710e 100644 --- a/source3/smbd/sec_ctx.c +++ b/source3/smbd/sec_ctx.c @@ -139,7 +139,6 @@ static void gain_root(void) static int get_current_groups(gid_t gid, uint32_t *p_ngroups, gid_t **p_groups) { int i; - gid_t grp; int ngroups; gid_t *groups = NULL; @@ -153,7 +152,7 @@ static int get_current_groups(gid_t gid, uint32_t *p_ngroups, gid_t **p_groups) set_effective_gid(gid); samba_setgid(gid); - ngroups = sys_getgroups(0,&grp); + ngroups = sys_getgroups(0, NULL); if (ngroups <= 0) { goto fail; } -- Samba Shared Repository