The branch, master has been updated via de1fdf1e020 s4:lib:policy: cleanup and handle errors in push_recursive() from 4486d686f5c gp: Add site-dn fallback when rpc call fails
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit de1fdf1e0207ff1c2e0ef6baed667cbfc001d7fb Author: Dmitry Antipov <danti...@cloudlinux.com> Date: Thu Apr 27 18:37:29 2023 +0300 s4:lib:policy: cleanup and handle errors in push_recursive() Prefer 'char' and 'ssize_t' over 'int' for I/O-related calls and handle more possible errors in push_recursive(). Signed-off-by: Dmitry Antipov <danti...@cloudlinux.com> Reviewed-by: Andrew Bartlett <abart...@samba.org> Reviewed-by: David Mulder <dmul...@samba.org> Autobuild-User(master): David Mulder <dmul...@samba.org> Autobuild-Date(master): Fri Apr 28 14:19:12 UTC 2023 on atb-devel-224 ----------------------------------------------------------------------- Summary of changes: source4/lib/policy/gp_filesys.c | 49 +++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 12 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/lib/policy/gp_filesys.c b/source4/lib/policy/gp_filesys.c index 8ad4645a830..bac4ae7f8c4 100644 --- a/source4/lib/policy/gp_filesys.c +++ b/source4/lib/policy/gp_filesys.c @@ -17,6 +17,7 @@ * along with this program; if not, see <http://www.gnu.org/licenses/>. */ #include "includes.h" +#include "system/dir.h" #include "system/filesys.h" #include "lib/policy/policy.h" #include "libcli/raw/smb.h" @@ -422,15 +423,20 @@ static NTSTATUS push_recursive (struct gp_context *gp_ctx, const char *local_pat char *entry_local_path = NULL; char *entry_remote_path = NULL; int local_fd = -1, remote_fd = -1; - int buf[1024]; - int nread, total_read; + char buf[4096]; + ssize_t nread, total_read; + ssize_t nwrite, total_write; struct stat s; NTSTATUS status; dir = opendir(local_path); + if (!dir) { + DEBUG(0, ("Failed to open directory: %s\n", local_path)); + return NT_STATUS_UNSUCCESSFUL; + } + while ((dirent = readdir(dir)) != NULL) { - if (strcmp(dirent->d_name, ".") == 0 || - strcmp(dirent->d_name, "..") == 0) { + if (ISDOT(dirent->d_name) || ISDOTDOT(dirent->d_name)) { continue; } @@ -455,10 +461,19 @@ static NTSTATUS push_recursive (struct gp_context *gp_ctx, const char *local_pat if (s.st_mode & S_IFDIR) { DEBUG(6, ("Pushing directory %s to %s on sysvol\n", entry_local_path, entry_remote_path)); - smbcli_mkdir(gp_ctx->cli->tree, entry_remote_path); + status = smbcli_mkdir(gp_ctx->cli->tree, + entry_remote_path); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } if (depth < GP_MAX_DEPTH) { - push_recursive(gp_ctx, entry_local_path, - entry_remote_path, depth+1); + status = push_recursive(gp_ctx, + entry_local_path, + entry_remote_path, + depth + 1); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } } } else { DEBUG(6, ("Pushing file %s to %s on sysvol\n", @@ -481,18 +496,28 @@ static NTSTATUS push_recursive (struct gp_context *gp_ctx, const char *local_pat goto done; } total_read = 0; - while ((nread = read(local_fd, &buf, sizeof(buf)))) { + total_write = 0; + while ((nread = read(local_fd, buf, sizeof(buf)))) { if (nread == -1) { DBG_ERR("read failed with errno %s\n", strerror(errno)); status = NT_STATUS_UNSUCCESSFUL; - close(local_fd); - local_fd = -1; goto done; } - smbcli_write(gp_ctx->cli->tree, remote_fd, 0, - &buf, total_read, nread); + nwrite = smbcli_write(gp_ctx->cli->tree, + remote_fd, 0, buf, + total_read, nread); + if (nwrite < 0) { + status = NT_STATUS_UNSUCCESSFUL; + goto done; + } total_read += nread; + total_write += nwrite; + } + if (total_read != total_write) { + /* Weird and should not happen */ + status = NT_STATUS_UNEXPECTED_IO_ERROR; + goto done; } close(local_fd); -- Samba Shared Repository