s3: libsmb: Ensure return from net_share_enum_rpc() sets cli->raw_status on error.
authorJeremy Allison <jra@samba.org>
Thu, 31 Oct 2019 21:38:35 +0000 (14:38 -0700)
committerAndreas Schneider <asn@cryptomilk.org>
Tue, 5 Nov 2019 12:36:48 +0000 (12:36 +0000)
Convert net_share_enum_rpc() to return an NTSTATUS and ensure the
status is set correctly on error so SMBC_errno() can return it.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14176

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Tue Nov  5 12:36:48 UTC 2019 on sn-devel-184

source3/libsmb/libsmb_dir.c

index 851be5de8fff4e40821299d0ba81b27eb19a9630..8eecde0668e6c186a27fedfca27b58867b800e16 100644 (file)
@@ -351,7 +351,7 @@ dir_list_fn(const char *mnt,
        return NT_STATUS_OK;
 }
 
-static int
+static NTSTATUS
 net_share_enum_rpc(struct cli_state *cli,
                    void (*fn)(const char *name,
                               uint32_t type,
@@ -378,7 +378,7 @@ net_share_enum_rpc(struct cli_state *cli,
                                             &pipe_hnd);
         if (!NT_STATUS_IS_OK(nt_status)) {
                 DEBUG(1, ("net_share_enum_rpc pipe open fail!\n"));
-                return -1;
+               goto done;
         }
 
        ZERO_STRUCT(info_ctr);
@@ -401,18 +401,18 @@ net_share_enum_rpc(struct cli_state *cli,
         /* Was it successful? */
        if (!NT_STATUS_IS_OK(nt_status)) {
                 /*  Nope.  Go clean up. */
-               result = ntstatus_to_werror(nt_status);
                goto done;
        }
 
        if (!W_ERROR_IS_OK(result)) {
                 /*  Nope.  Go clean up. */
+               nt_status = werror_to_ntstatus(result);
                goto done;
         }
 
        if (total_entries == 0) {
                 /*  Nope.  Go clean up. */
-               result = WERR_GEN_FAILURE;
+               nt_status = NT_STATUS_NOT_FOUND;
                goto done;
        }
 
@@ -437,7 +437,7 @@ done:
         TALLOC_FREE(pipe_hnd);
 
         /* Tell 'em if it worked */
-        return W_ERROR_IS_OK(result) ? 0 : -1;
+        return nt_status;
 }
 
 
@@ -826,7 +826,7 @@ SMBC_opendir_ctx(SMBCCTX *context,
                                }
                        } else if (srv ||
                                    (resolve_name(server, &rem_ss, 0x20, false))) {
-                               int rc;
+                               NTSTATUS status;
 
                                 /*
                                  * If we hadn't found the server, get one now
@@ -853,27 +853,38 @@ SMBC_opendir_ctx(SMBCCTX *context,
 
                                 /* List the shares ... */
 
-                               rc = net_share_enum_rpc(srv->cli,
+                               status = net_share_enum_rpc(srv->cli,
                                                        list_fn,
                                                        (void *)dir);
-                               if (rc != 0 &&
+                               if (!NT_STATUS_IS_OK(status) &&
                                    smbXcli_conn_protocol(srv->cli->conn) <=
                                                PROTOCOL_NT1) {
                                        /*
                                         * Only call cli_RNetShareEnum()
                                         * on SMB1 connections, not SMB2+.
                                         */
-                                       rc = cli_RNetShareEnum(srv->cli,
+                                       int rc = cli_RNetShareEnum(srv->cli,
                                                               list_fn,
                                                               (void *)dir);
+                                       if (rc != 0) {
+                                               status = cli_nt_error(srv->cli);
+                                       } else {
+                                               status = NT_STATUS_OK;
+                                       }
                                }
-                               if (rc != 0) {
-                                       errno = cli_errno(srv->cli);
+                               if (!NT_STATUS_IS_OK(status)) {
+                                       /*
+                                        * Set cli->raw_status so SMBC_errno()
+                                        * will correctly return the error.
+                                        */
+                                       srv->cli->raw_status = status;
                                        if (dir != NULL) {
                                                SAFE_FREE(dir->fname);
                                                SAFE_FREE(dir);
                                        }
                                        TALLOC_FREE(frame);
+                                       errno = map_errno_from_nt_status(
+                                                               status);
                                        return NULL;
                                }
                         } else {