The branch, master has been updated
       via  1cba9de1444 Fix a few "might be uninitialized" errors
       via  316579b5029 smbd: Slightly simplify notifyd_send_delete()
       via  190ae0796eb smbd: Simplify smb_set_file_unix_link()
       via  88921ac1774 smbd: Simplify smb_q_posix_symlink()
       via  e35b3af2e8b smbd: Simplify call_trans2qpathinfo()
      from  daf6d371f36 s3:rpc_client: implement bind time feature negotiation

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 1cba9de14444933a51972b725e0f4852704d2a8c
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Jan 22 21:33:05 2024 +0100

    Fix a few "might be uninitialized" errors
    
    I've seen them with clang
    
    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): Tue Apr 23 19:02:10 UTC 2024 on atb-devel-224

commit 316579b5029823ba19eda2a131a3a2a5df7419a1
Author: Volker Lendecke <v...@samba.org>
Date:   Tue Feb 27 15:32:59 2024 +0100

    smbd: Slightly simplify notifyd_send_delete()
    
    Call messaging_send_iov() instead of messaging_send_iov_from().
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 190ae0796ebaaf4f2fc2479f81637207d1fa8934
Author: Volker Lendecke <v...@samba.org>
Date:   Mon Feb 12 10:26:28 2024 +0100

    smbd: Simplify smb_set_file_unix_link()
    
    Avoid a call to parent_pathref, use the dirfsp that already exists
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit 88921ac177421c25827092df3f063baa80f9f4bf
Author: Volker Lendecke <v...@samba.org>
Date:   Sun Feb 11 13:10:01 2024 +0100

    smbd: Simplify smb_q_posix_symlink()
    
    Use the dirfsp from call_trans2qpathinfo(), avoid a call to parent_pathref()
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

commit e35b3af2e8b82678b2d77ea39a132f6ecaca9991
Author: Volker Lendecke <v...@samba.org>
Date:   Sat Feb 10 14:26:55 2024 +0100

    smbd: Simplify call_trans2qpathinfo()
    
    These days filename_convert_dirfsp() always returns a full fsp.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Jeremy Allison <j...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/libsmb/libsmb_file.c      |   2 +-
 source3/smbd/notifyd/notifyd.c    |  18 +++--
 source3/smbd/smb1_trans2.c        | 147 +++++++++++++-------------------------
 source4/auth/sam.c                |   2 +-
 source4/dsdb/common/rodc_helper.c |   2 +-
 5 files changed, 63 insertions(+), 108 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/libsmb_file.c b/source3/libsmb/libsmb_file.c
index ff18d569757..5861718d672 100644
--- a/source3/libsmb/libsmb_file.c
+++ b/source3/libsmb/libsmb_file.c
@@ -470,7 +470,7 @@ SMBC_getatr(SMBCCTX * context,
        mode_t mode = S_IFREG;
        struct cli_credentials *creds = NULL;
        TALLOC_CTX *frame = talloc_stackframe();
-       NTSTATUS status;
+       NTSTATUS status = NT_STATUS_ACCESS_DENIED;
 
        if (!context || !context->internal->initialized) {
                TALLOC_FREE(frame);
diff --git a/source3/smbd/notifyd/notifyd.c b/source3/smbd/notifyd/notifyd.c
index 4af62a9a1f9..64dd26a7e11 100644
--- a/source3/smbd/notifyd/notifyd.c
+++ b/source3/smbd/notifyd/notifyd.c
@@ -790,7 +790,7 @@ static void notifyd_send_delete(struct messaging_context 
*msg_ctx,
        };
        uint8_t nul = 0;
        struct iovec iov[3];
-       int ret;
+       NTSTATUS status;
 
        /*
         * Send a rec_change to ourselves to delete a dead entry
@@ -802,13 +802,17 @@ static void notifyd_send_delete(struct messaging_context 
*msg_ctx,
        iov[1] = (struct iovec) { .iov_base = key.dptr, .iov_len = key.dsize };
        iov[2] = (struct iovec) { .iov_base = &nul, .iov_len = sizeof(nul) };
 
-       ret = messaging_send_iov_from(
-               msg_ctx, instance->client, messaging_server_id(msg_ctx),
-               MSG_SMB_NOTIFY_REC_CHANGE, iov, ARRAY_SIZE(iov), NULL, 0);
+       status = messaging_send_iov(msg_ctx,
+                                   instance->client,
+                                   MSG_SMB_NOTIFY_REC_CHANGE,
+                                   iov,
+                                   ARRAY_SIZE(iov),
+                                   NULL,
+                                   0);
 
-       if (ret != 0) {
-               DBG_WARNING("messaging_send_iov_from returned %s\n",
-                           strerror(ret));
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_WARNING("messaging_send_iov failed: %s\n",
+                           nt_errstr(status));
        }
 }
 
diff --git a/source3/smbd/smb1_trans2.c b/source3/smbd/smb1_trans2.c
index ae5fee7e2ff..e31bdf02fe8 100644
--- a/source3/smbd/smb1_trans2.c
+++ b/source3/smbd/smb1_trans2.c
@@ -2529,16 +2529,14 @@ static NTSTATUS smb_q_posix_acl(
 static NTSTATUS smb_q_posix_symlink(
        struct connection_struct *conn,
        struct smb_request *req,
+       struct files_struct *dirfsp,
        struct smb_filename *smb_fname,
        char **ppdata,
        int *ptotal_data)
 {
-       char buffer[PATH_MAX+1];
+       char *target = NULL;
        size_t needed, len;
-       int link_len;
        char *pdata = NULL;
-       struct smb_filename *parent_fname = NULL;
-       struct smb_filename *base_name = NULL;
        NTSTATUS status;
 
        DBG_DEBUG("SMB_QUERY_FILE_UNIX_LINK for file %s\n",
@@ -2548,40 +2546,39 @@ static NTSTATUS smb_q_posix_symlink(
                return NT_STATUS_DOS(ERRSRV, ERRbadlink);
        }
 
-       status = parent_pathref(
-               talloc_tos(),
-               conn->cwd_fsp,
-               smb_fname,
-               &parent_fname,
-               &base_name);
+       if (fsp_get_pathref_fd(smb_fname->fsp) != -1) {
+               /*
+                * fsp is an O_PATH open, Linux does a "freadlink"
+                * with an empty name argument to readlinkat
+                */
+               status = readlink_talloc(talloc_tos(),
+                                        smb_fname->fsp,
+                                        NULL,
+                                        &target);
+       } else {
+               struct smb_filename smb_fname_rel = *smb_fname;
+               char *slash = NULL;
 
-       if (!NT_STATUS_IS_OK(status)) {
-               DBG_DEBUG("parent_pathref failed: %s\n", nt_errstr(status));
-               return status;
+               slash = strrchr_m(smb_fname->base_name, '/');
+               if (slash != NULL) {
+                       smb_fname_rel.base_name = slash + 1;
+               }
+               status = readlink_talloc(talloc_tos(),
+                                        dirfsp,
+                                        &smb_fname_rel,
+                                        &target);
        }
 
-       link_len = SMB_VFS_READLINKAT(
-               conn,
-               parent_fname->fsp,
-               base_name,
-               buffer,
-               sizeof(buffer)-1);
-       TALLOC_FREE(parent_fname);
-
-       if (link_len == -1) {
-               status = map_nt_error_from_unix(errno);
-               DBG_DEBUG("READLINKAT failed: %s\n", nt_errstr(status));
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("readlink_talloc() failed: %s\n", nt_errstr(status));
                return status;
        }
-       if (link_len >= sizeof(buffer)) {
-               return NT_STATUS_INTERNAL_ERROR;
-       }
-       buffer[link_len] = 0;
 
-       needed = (link_len+1)*2;
+       needed = talloc_get_size(target) * 2;
 
        *ppdata = SMB_REALLOC(*ppdata, needed);
        if (*ppdata == NULL) {
+               TALLOC_FREE(target);
                return NT_STATUS_NO_MEMORY;
        }
        pdata = *ppdata;
@@ -2590,10 +2587,11 @@ static NTSTATUS smb_q_posix_symlink(
                pdata,
                req->flags2,
                pdata,
-               buffer,
+               target,
                needed,
                STR_TERMINATE,
                &len);
+       TALLOC_FREE(target);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -2618,14 +2616,11 @@ static void call_trans2qpathinfo(
        struct timespec write_time_ts = { .tv_sec = 0, };
        struct files_struct *dirfsp = NULL;
        files_struct *fsp = NULL;
-       struct file_id fileid;
-       uint32_t name_hash;
        char *fname = NULL;
        uint32_t ucf_flags = ucf_flags_from_smb_request(req);
        NTTIME twrp = 0;
        bool info_level_handled;
        NTSTATUS status = NT_STATUS_OK;
-       int ret;
 
        if (!params) {
                reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
@@ -2718,65 +2713,24 @@ static void call_trans2qpathinfo(
        fsp = smb_fname->fsp;
 
        /* If this is a stream, check if there is a delete_pending. */
-       if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
-           && is_ntfs_stream_smb_fname(smb_fname)) {
-               struct smb_filename *smb_fname_base;
-
-               /* Create an smb_filename with stream_name == NULL. */
-               smb_fname_base = synthetic_smb_fname(
-                       talloc_tos(),
-                       smb_fname->base_name,
-                       NULL,
-                       NULL,
-                       smb_fname->twrp,
-                       smb_fname->flags);
-               if (smb_fname_base == NULL) {
-                       reply_nterror(req, NT_STATUS_NO_MEMORY);
-                       return;
-               }
+       if (fsp_is_alternate_stream(fsp)) {
 
-               ret = vfs_stat(conn, smb_fname_base);
-               if (ret != 0) {
-                       DBG_NOTICE("vfs_stat of %s failed "
-                                  "(%s)\n",
-                                  smb_fname_str_dbg(smb_fname_base),
-                                  strerror(errno));
-                       TALLOC_FREE(smb_fname_base);
-                       reply_nterror(req,
-                                     map_nt_error_from_unix(errno));
-                       return;
-               }
-
-               status = file_name_hash(conn,
-                                       smb_fname_str_dbg(smb_fname_base),
-                                       &name_hash);
-               if (!NT_STATUS_IS_OK(status)) {
-                       TALLOC_FREE(smb_fname_base);
-                       reply_nterror(req, status);
-                       return;
-               }
+               struct files_struct *base_fsp = fsp->base_fsp;
 
-               fileid = vfs_file_id_from_sbuf(conn,
-                                              &smb_fname_base->st);
-               TALLOC_FREE(smb_fname_base);
-               get_file_infos(fileid, name_hash, &delete_pending, NULL);
+               get_file_infos(base_fsp->file_id,
+                              base_fsp->name_hash,
+                              &delete_pending,
+                              NULL);
                if (delete_pending) {
                        reply_nterror(req, NT_STATUS_DELETE_PENDING);
                        return;
                }
        }
 
-       status = file_name_hash(conn,
-                               smb_fname_str_dbg(smb_fname),
-                               &name_hash);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               return;
-       }
-
        if (fsp_getinfo_ask_sharemode(fsp)) {
-               fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st);
-               get_file_infos(fileid, name_hash, &delete_pending,
+               get_file_infos(fsp->file_id,
+                              fsp->name_hash,
+                              &delete_pending,
                               &write_time_ts);
        }
 
@@ -2827,6 +2781,7 @@ static void call_trans2qpathinfo(
                status = smb_q_posix_symlink(
                        conn,
                        req,
+                       dirfsp,
                        smb_fname,
                        ppdata,
                        &total_data);
@@ -3720,15 +3675,16 @@ static NTSTATUS 
smb_set_file_unix_link(connection_struct *conn,
                                       struct smb_request *req,
                                       const char *pdata,
                                       int total_data,
+                                      struct files_struct *dirfsp,
                                       struct smb_filename *new_smb_fname)
 {
        char *link_target = NULL;
        struct smb_filename target_fname;
        TALLOC_CTX *ctx = talloc_tos();
+       struct smb_filename new_smb_fname_rel = {};
+       char *slash = NULL;
        NTSTATUS status;
        int ret;
-       struct smb_filename *parent_fname = NULL;
-       struct smb_filename *base_name = NULL;
 
        if (!CAN_WRITE(conn)) {
                return NT_STATUS_DOS(ERRSRV, ERRaccess);
@@ -3765,25 +3721,20 @@ static NTSTATUS 
smb_set_file_unix_link(connection_struct *conn,
        DBG_DEBUG("SMB_SET_FILE_UNIX_LINK doing symlink %s -> %s\n",
                  new_smb_fname->base_name, link_target);
 
-       status = parent_pathref(talloc_tos(),
-                               conn->cwd_fsp,
-                               new_smb_fname,
-                               &parent_fname,
-                               &base_name);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
+       new_smb_fname_rel = *new_smb_fname;
+       slash = strrchr_m(new_smb_fname_rel.base_name, '/');
+       if (slash != NULL) {
+               new_smb_fname_rel.base_name = slash + 1;
        }
 
        ret = SMB_VFS_SYMLINKAT(conn,
-                       &target_fname,
-                       parent_fname->fsp,
-                       base_name);
+                               &target_fname,
+                               dirfsp,
+                               &new_smb_fname_rel);
        if (ret != 0) {
-               TALLOC_FREE(parent_fname);
                return map_nt_error_from_unix(errno);
        }
 
-       TALLOC_FREE(parent_fname);
        return NT_STATUS_OK;
 }
 
@@ -4583,7 +4534,7 @@ static void call_trans2setpathinfo(
 
        case SMB_SET_FILE_UNIX_LINK:
                status = smb_set_file_unix_link(
-                       conn, req, *ppdata, total_data, smb_fname);
+                       conn, req, *ppdata, total_data, dirfsp, smb_fname);
                break;
 
        case SMB_SET_FILE_UNIX_HLINK:
diff --git a/source4/auth/sam.c b/source4/auth/sam.c
index 1445adf2261..bd8219d7335 100644
--- a/source4/auth/sam.c
+++ b/source4/auth/sam.c
@@ -1581,7 +1581,7 @@ NTSTATUS authsam_logon_success_accounting(struct 
ldb_context *sam_ctx,
        NTTIME sync_interval_nt = 0;
        bool am_rodc = false;
        bool txn_active = false;
-       bool need_db_reread;
+       bool need_db_reread = false;
 
        mem_ctx = talloc_new(msg);
        if (mem_ctx == NULL) {
diff --git a/source4/dsdb/common/rodc_helper.c 
b/source4/dsdb/common/rodc_helper.c
index b4982aee9ed..5ed60e0af43 100644
--- a/source4/dsdb/common/rodc_helper.c
+++ b/source4/dsdb/common/rodc_helper.c
@@ -243,7 +243,7 @@ WERROR samdb_confirm_rodc_allowed_to_repl_to(struct 
ldb_context *sam_ctx,
 {
        TALLOC_CTX *frame = talloc_stackframe();
        WERROR werr;
-       uint32_t num_token_sids;
+       uint32_t num_token_sids = 0;
        struct dom_sid *token_sids;
        const struct dom_sid *object_sid = NULL;
 


-- 
Samba Shared Repository

Reply via email to