From d4f8fdd69a1278d8473d541dc6b32014a369bcd0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 21 Jan 2022 21:15:06 +0100 Subject: [PATCH] libsmb: Convert SMBC_getatr() to NTSTATUS This avoids a few calls to SMBC_errno() Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- source3/include/libsmb_internal.h | 2 +- source3/libsmb/libsmb_dir.c | 17 +++++++++-------- source3/libsmb/libsmb_file.c | 19 +++++++------------ source3/libsmb/libsmb_stat.c | 6 ++++-- source3/libsmb/libsmb_xattr.c | 12 ++++++++---- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/source3/include/libsmb_internal.h b/source3/include/libsmb_internal.h index 88d0fdf8b8b..5588f9df66a 100644 --- a/source3/include/libsmb_internal.h +++ b/source3/include/libsmb_internal.h @@ -400,7 +400,7 @@ int SMBC_close_ctx(SMBCCTX *context, SMBCFILE *file); -bool +NTSTATUS SMBC_getatr(SMBCCTX * context, SMBCSRV *srv, const char *path, diff --git a/source3/libsmb/libsmb_dir.c b/source3/libsmb/libsmb_dir.c index 2f4a3815bb2..bf7b8f8b9b5 100644 --- a/source3/libsmb/libsmb_dir.c +++ b/source3/libsmb/libsmb_dir.c @@ -985,10 +985,12 @@ SMBC_opendir_ctx(SMBCCTX *context, */ path[path_len] = '\0'; /* restore original path */ - if (SMBC_getatr(context, - srv, - path, - &sb) && + status = SMBC_getatr( + context, + srv, + path, + &sb); + if (NT_STATUS_IS_OK(status) && !S_ISDIR(sb.st_mode)) { /* It is. Correct the error value */ @@ -2255,14 +2257,13 @@ SMBC_unlink_ctx(SMBCCTX *context, int saverr = errno; struct stat sb = {0}; - bool ok; - ok = SMBC_getatr(context, srv, path, &sb); - if (!ok) { + status = SMBC_getatr(context, srv, path, &sb); + if (!NT_STATUS_IS_OK(status)) { /* Hmmm, bad error ... What? */ - errno = SMBC_errno(context, targetcli); TALLOC_FREE(frame); + errno = cli_status_to_errno(status); return -1; } diff --git a/source3/libsmb/libsmb_file.c b/source3/libsmb/libsmb_file.c index 0ec1cf64cbb..499be92cb4a 100644 --- a/source3/libsmb/libsmb_file.c +++ b/source3/libsmb/libsmb_file.c @@ -450,7 +450,7 @@ SMBC_close_ctx(SMBCCTX *context, * Get info from an SMB server on a file. Use a qpathinfo call first * and if that fails, use getatr, as Win95 sometimes refuses qpathinfo */ -bool +NTSTATUS SMBC_getatr(SMBCCTX * context, SMBCSRV *srv, const char *path, @@ -472,25 +472,22 @@ SMBC_getatr(SMBCCTX * context, NTSTATUS status; if (!context || !context->internal->initialized) { - errno = EINVAL; TALLOC_FREE(frame); - return False; + return NT_STATUS_INVALID_PARAMETER; } /* path fixup for . and .. */ if (ISDOT(path) || ISDOTDOT(path)) { fixedpath = talloc_strdup(frame, "\\"); if (!fixedpath) { - errno = ENOMEM; TALLOC_FREE(frame); - return False; + return NT_STATUS_NO_MEMORY; } } else { fixedpath = talloc_strdup(frame, path); if (!fixedpath) { - errno = ENOMEM; TALLOC_FREE(frame); - return False; + return NT_STATUS_NO_MEMORY; } trim_string(fixedpath, NULL, "\\.."); trim_string(fixedpath, NULL, "\\."); @@ -505,9 +502,8 @@ SMBC_getatr(SMBCCTX * context, &targetcli, &targetpath); if (!NT_STATUS_IS_OK(status)) { d_printf("Couldn't resolve %s\n", path); - errno = ENOENT; TALLOC_FREE(frame); - return False; + return NT_STATUS_OBJECT_NAME_NOT_FOUND; } if (!srv->no_pathinfo2) { @@ -571,15 +567,14 @@ setup_stat: write_time_ts); TALLOC_FREE(frame); - return true; + return NT_STATUS_OK; all_failed: srv->no_pathinfo2 = False; srv->no_pathinfo3 = False; - errno = EPERM; TALLOC_FREE(frame); - return False; + return NT_STATUS_ACCESS_DENIED; } /* diff --git a/source3/libsmb/libsmb_stat.c b/source3/libsmb/libsmb_stat.c index 32c67b048c7..aa0b2dbe2b3 100644 --- a/source3/libsmb/libsmb_stat.c +++ b/source3/libsmb/libsmb_stat.c @@ -173,6 +173,7 @@ SMBC_stat_ctx(SMBCCTX *context, char *workgroup = NULL; char *path = NULL; uint16_t port = 0; + NTSTATUS status; TALLOC_CTX *frame = talloc_stackframe(); if (!context || !context->internal->initialized) { @@ -221,9 +222,10 @@ SMBC_stat_ctx(SMBCCTX *context, return -1; /* errno set by SMBC_server */ } - if (!SMBC_getatr(context, srv, path, st)) { - errno = SMBC_errno(context, srv->cli); + status = SMBC_getatr(context, srv, path, st); + if (!NT_STATUS_IS_OK(status)) { TALLOC_FREE(frame); + errno = cli_status_to_errno(status); return -1; } diff --git a/source3/libsmb/libsmb_xattr.c b/source3/libsmb/libsmb_xattr.c index d66ea63617c..aed3b486a3d 100644 --- a/source3/libsmb/libsmb_xattr.c +++ b/source3/libsmb/libsmb_xattr.c @@ -552,6 +552,7 @@ dos_attr_query(SMBCCTX *context, { struct stat sb = {0}; struct DOS_ATTR_DESC *ret = NULL; + NTSTATUS status; ret = talloc(ctx, struct DOS_ATTR_DESC); if (!ret) { @@ -560,10 +561,11 @@ dos_attr_query(SMBCCTX *context, } /* Obtain the DOS attributes */ - if (!SMBC_getatr(context, srv, filename, &sb)) { - errno = SMBC_errno(context, srv->cli); + status = SMBC_getatr(context, srv, filename, &sb); + if (!NT_STATUS_IS_OK(status)) { DEBUG(5, ("dos_attr_query Failed to query old attributes\n")); TALLOC_FREE(ret); + errno = cli_status_to_errno(status); return NULL; } @@ -1151,13 +1153,15 @@ cacl_get(SMBCCTX *context, off_t size = 0; uint16_t mode = 0; SMB_INO_T ino = 0; + NTSTATUS status; /* Point to the portion after "system.dos_attr." */ name += 16; /* if (all) this will be invalid but unused */ /* Obtain the DOS attributes */ - if (!SMBC_getatr(context, srv, filename, &sb)) { - errno = SMBC_errno(context, srv->cli); + status = SMBC_getatr(context, srv, filename, &sb); + if (!NT_STATUS_IS_OK(status)) { + errno = cli_status_to_errno(status); return -1; } -- 2.34.1