The branch, master has been updated via ddbb8f1999e lib: Move 448 bytes from R/W data segment to R/O text via c5bc9f732fe lib: Avoid an includes.h via 148b86b2ce0 lib: Align an integer type via bb94ec26557 tdb: Move 160 bytes from R/W data segment to R/O text via e2ccd822037 smbd: Remove a pointless NULL check from readlink_talloc() via 88848bc0732 smbd: Use direct struct initialization, avoid explicit ZERO_STRUCT() via c26f7fcc625 smbd: Fix a debug message via 7fcbae4e494 libsmb: Don't mess up pathnames in cli_smb2_create_fnum_send() from 17bbd6ec4c2 smbd: Add "posix" flag to openat_pathref_dirfsp_nosymlink()
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ddbb8f1999e9e949e3ef0db7cef94115feeb8148 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 12 21:20:07 2022 +0100 lib: Move 448 bytes from R/W data segment to R/O text The linker has to relocate the pointers in the array at startup, save that. I know we have bigger .data blobs, but every bit counts :-) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Dec 15 22:51:06 UTC 2022 on sn-devel-184 commit c5bc9f732fe45bc3a8099f57a1e771cda0036154 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 12 21:02:29 2022 +0100 lib: Avoid an includes.h Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 148b86b2ce0a844a8d497c227d998371fc72c339 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 12 21:02:17 2022 +0100 lib: Align an integer type Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit bb94ec26557f3d254ce3391d83c200ac3a05abdd Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 12 21:20:07 2022 +0100 tdb: Move 160 bytes from R/W data segment to R/O text The linker has to relocate the pointers in the array at startup, save that. I know we have bigger .data blobs, but every bit counts :-) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit e2ccd822037ac14cdedd971fde3a315922c0d135 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 5 11:51:28 2022 +0100 smbd: Remove a pointless NULL check from readlink_talloc() We should never call this without the place to put the target in. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 88848bc07325cec651a57443f5998a411403774a Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 2 12:05:14 2022 +0100 smbd: Use direct struct initialization, avoid explicit ZERO_STRUCT() Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c26f7fcc625a365cf943151437953d3dbb0d1159 Author: Volker Lendecke <v...@samba.org> Date: Mon Dec 5 16:33:37 2022 +0100 smbd: Fix a debug message This used to be openat_pathref_nostream() at some point back Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 7fcbae4e4940c8d89717c4fa4199d57d69c1d3a4 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 15 19:06:20 2022 +0100 libsmb: Don't mess up pathnames in cli_smb2_create_fnum_send() Master-only bug introduced with dd9cdfb3b14: smb2_dfs_share_path() can change the length of fname, and if it happens that the original length hits a \ in the enlarged filename, we cut it off. Found by accident, this really made me scratch my head when looking at traces :-) Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/tdb/common/error.c | 53 ++++++++++------ libds/common/flag_mapping.c | 140 ++++++++++++++++++++++++++++------------- source3/libsmb/cli_smb2_fnum.c | 1 + source3/smbd/dosmode.c | 7 +-- source3/smbd/files.c | 6 +- 5 files changed, 134 insertions(+), 73 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/tdb/common/error.c b/lib/tdb/common/error.c index 478eb887ffd..c3ef8bd1438 100644 --- a/lib/tdb/common/error.c +++ b/lib/tdb/common/error.c @@ -32,26 +32,43 @@ _PUBLIC_ enum TDB_ERROR tdb_error(struct tdb_context *tdb) return tdb->ecode; } -static struct tdb_errname { - enum TDB_ERROR ecode; const char *estring; -} emap[] = { {TDB_SUCCESS, "Success"}, - {TDB_ERR_CORRUPT, "Corrupt database"}, - {TDB_ERR_IO, "IO Error"}, - {TDB_ERR_LOCK, "Locking error"}, - {TDB_ERR_OOM, "Out of memory"}, - {TDB_ERR_EXISTS, "Record exists"}, - {TDB_ERR_NOLOCK, "Lock exists on other keys"}, - {TDB_ERR_EINVAL, "Invalid parameter"}, - {TDB_ERR_NOEXIST, "Record does not exist"}, - {TDB_ERR_RDONLY, "write not permitted"} }; - -/* Error string for the last tdb error */ _PUBLIC_ const char *tdb_errorstr(struct tdb_context *tdb) { - uint32_t i; - for (i = 0; i < sizeof(emap) / sizeof(struct tdb_errname); i++) - if (tdb->ecode == emap[i].ecode) - return emap[i].estring; + switch (tdb->ecode) { + case TDB_SUCCESS: + return "Success"; + break; + case TDB_ERR_CORRUPT: + return "Corrupt database"; + break; + case TDB_ERR_IO: + return "IO Error"; + break; + case TDB_ERR_LOCK: + return "Locking error"; + break; + case TDB_ERR_OOM: + return "Out of memory"; + break; + case TDB_ERR_EXISTS: + return "Record exists"; + break; + case TDB_ERR_NOLOCK: + return "Lock exists on other keys"; + break; + case TDB_ERR_EINVAL: + return "Invalid parameter"; + break; + case TDB_ERR_NOEXIST: + return "Record does not exist"; + break; + case TDB_ERR_RDONLY: + return "write not permitted"; + break; + default: + break; + } + return "Invalid error code"; } diff --git a/libds/common/flag_mapping.c b/libds/common/flag_mapping.c index 020922db659..fb64014c74d 100644 --- a/libds/common/flag_mapping.c +++ b/libds/common/flag_mapping.c @@ -20,7 +20,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "includes.h" +#include "replace.h" +#include "lib/util/data_blob.h" +#include "lib/util/time.h" +#include "lib/util/debug.h" #include "librpc/gen_ndr/samr.h" #include "../libds/common/flags.h" #include "flag_mapping.h" @@ -165,52 +168,99 @@ uint32_t ds_uf2prim_group_rid(uint32_t uf) return prim_group_rid; } -#define FLAG(x) { .name = #x, .uf = x } -struct { - const char *name; - uint32_t uf; -} user_account_control_name_map[] = { - FLAG(UF_SCRIPT), - FLAG(UF_ACCOUNTDISABLE), - FLAG(UF_00000004), - FLAG(UF_HOMEDIR_REQUIRED), - FLAG(UF_LOCKOUT), - FLAG(UF_PASSWD_NOTREQD), - FLAG(UF_PASSWD_CANT_CHANGE), - FLAG(UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED), - - FLAG(UF_TEMP_DUPLICATE_ACCOUNT), - FLAG(UF_NORMAL_ACCOUNT), - FLAG(UF_00000400), - FLAG(UF_INTERDOMAIN_TRUST_ACCOUNT), - - FLAG(UF_WORKSTATION_TRUST_ACCOUNT), - FLAG(UF_SERVER_TRUST_ACCOUNT), - FLAG(UF_00004000), - FLAG(UF_00008000), - - FLAG(UF_DONT_EXPIRE_PASSWD), - FLAG(UF_MNS_LOGON_ACCOUNT), - FLAG(UF_SMARTCARD_REQUIRED), - FLAG(UF_TRUSTED_FOR_DELEGATION), - - FLAG(UF_NOT_DELEGATED), - FLAG(UF_USE_DES_KEY_ONLY), - FLAG(UF_DONT_REQUIRE_PREAUTH), - FLAG(UF_PASSWORD_EXPIRED), - FLAG(UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION), - FLAG(UF_NO_AUTH_DATA_REQUIRED), - FLAG(UF_PARTIAL_SECRETS_ACCOUNT), - FLAG(UF_USE_AES_KEYS) -}; - const char *dsdb_user_account_control_flag_bit_to_string(uint32_t uf) { - int i; - for (i=0; i < ARRAY_SIZE(user_account_control_name_map); i++) { - if (uf == user_account_control_name_map[i].uf) { - return user_account_control_name_map[i].name; - } + switch (uf) { + case UF_SCRIPT: + return "UF_SCRIPT"; + break; + case UF_ACCOUNTDISABLE: + return "UF_ACCOUNTDISABLE"; + break; + case UF_00000004: + return "UF_00000004"; + break; + case UF_HOMEDIR_REQUIRED: + return "UF_HOMEDIR_REQUIRED"; + break; + case UF_LOCKOUT: + return "UF_LOCKOUT"; + break; + case UF_PASSWD_NOTREQD: + return "UF_PASSWD_NOTREQD"; + break; + case UF_PASSWD_CANT_CHANGE: + return "UF_PASSWD_CANT_CHANGE"; + break; + case UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED: + return "UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED"; + break; + + case UF_TEMP_DUPLICATE_ACCOUNT: + return "UF_TEMP_DUPLICATE_ACCOUNT"; + break; + case UF_NORMAL_ACCOUNT: + return "UF_NORMAL_ACCOUNT"; + break; + case UF_00000400: + return "UF_00000400"; + break; + case UF_INTERDOMAIN_TRUST_ACCOUNT: + return "UF_INTERDOMAIN_TRUST_ACCOUNT"; + break; + + case UF_WORKSTATION_TRUST_ACCOUNT: + return "UF_WORKSTATION_TRUST_ACCOUNT"; + break; + case UF_SERVER_TRUST_ACCOUNT: + return "UF_SERVER_TRUST_ACCOUNT"; + break; + case UF_00004000: + return "UF_00004000"; + break; + case UF_00008000: + return "UF_00008000"; + break; + + case UF_DONT_EXPIRE_PASSWD: + return "UF_DONT_EXPIRE_PASSWD"; + break; + case UF_MNS_LOGON_ACCOUNT: + return "UF_MNS_LOGON_ACCOUNT"; + break; + case UF_SMARTCARD_REQUIRED: + return "UF_SMARTCARD_REQUIRED"; + break; + case UF_TRUSTED_FOR_DELEGATION: + return "UF_TRUSTED_FOR_DELEGATION"; + break; + + case UF_NOT_DELEGATED: + return "UF_NOT_DELEGATED"; + break; + case UF_USE_DES_KEY_ONLY: + return "UF_USE_DES_KEY_ONLY"; + break; + case UF_DONT_REQUIRE_PREAUTH: + return "UF_DONT_REQUIRE_PREAUTH"; + break; + case UF_PASSWORD_EXPIRED: + return "UF_PASSWORD_EXPIRED"; + break; + case UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION: + return "UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION"; + break; + case UF_NO_AUTH_DATA_REQUIRED: + return "UF_NO_AUTH_DATA_REQUIRED"; + break; + case UF_PARTIAL_SECRETS_ACCOUNT: + return "UF_PARTIAL_SECRETS_ACCOUNT"; + break; + case UF_USE_AES_KEYS: + return "UF_USE_AES_KEYS"; + break; + default: + break; } return NULL; } diff --git a/source3/libsmb/cli_smb2_fnum.c b/source3/libsmb/cli_smb2_fnum.c index 5cf6f5baf7b..bb99201bb61 100644 --- a/source3/libsmb/cli_smb2_fnum.c +++ b/source3/libsmb/cli_smb2_fnum.c @@ -287,6 +287,7 @@ struct tevent_req *cli_smb2_create_fnum_send( if (tevent_req_nomem(fname, req)) { return tevent_req_post(req, ev); } + fname_len = strlen(fname); /* SMB2 is pickier about pathnames. Ensure it doesn't start in a '\' */ diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c index 4168eb209c7..5a88cd059b0 100644 --- a/source3/smbd/dosmode.c +++ b/source3/smbd/dosmode.c @@ -410,9 +410,9 @@ NTSTATUS set_ea_dos_attribute(connection_struct *conn, struct smb_filename *smb_fname, uint32_t dosmode) { - struct xattr_DOSATTRIB dosattrib; + struct xattr_DOSATTRIB dosattrib = { .version = 0, }; enum ndr_err_code ndr_err; - DATA_BLOB blob; + DATA_BLOB blob = { .data = NULL, }; struct timespec btime; int ret; @@ -430,9 +430,6 @@ NTSTATUS set_ea_dos_attribute(connection_struct *conn, */ dosmode &= ~FILE_ATTRIBUTE_OFFLINE; - ZERO_STRUCT(dosattrib); - ZERO_STRUCT(blob); - dosattrib.version = 5; dosattrib.info.info5.valid_flags = XATTR_DOSINFO_ATTRIB | XATTR_DOSINFO_CREATE_TIME; diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 3ea879eee3e..87684b1984d 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -614,7 +614,7 @@ NTSTATUS openat_pathref_fsp(const struct files_struct *dirfsp, conn, dirfsp, NULL, &full_fname, base_fname, &how); TALLOC_FREE(full_fname); if (!NT_STATUS_IS_OK(status)) { - DBG_DEBUG("openat_pathref_nostream failed: %s\n", + DBG_DEBUG("openat_pathref_fullname() failed: %s\n", nt_errstr(status)); goto fail; } @@ -693,10 +693,6 @@ NTSTATUS readlink_talloc( char *substitute; NTSTATUS status; - if (_substitute == NULL) { - return NT_STATUS_OK; - } - if (smb_relname == NULL) { /* * We have a Linux O_PATH handle in dirfsp and want to -- Samba Shared Repository