s3:rpc_server: Return NTSTATUS in is_known_pipename function
authorSamuel Cabrero <scabrero@suse.de>
Mon, 18 Feb 2019 20:06:02 +0000 (21:06 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 22 Jul 2019 16:49:16 +0000 (16:49 +0000)
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/rpc_server/srv_pipe.c
source3/rpc_server/srv_pipe.h
source3/rpc_server/srv_pipe_hnd.c
testsuite/unittests/test_sambafs_srv_pipe.c

index fec8d276e13f6956afbee3e87e348fc4a1a7d946..e48d2cf34d0e72027e3c34bf87ae98b19e209295 100644 (file)
@@ -475,44 +475,43 @@ static bool check_bind_req(struct pipes_struct *p,
 /**
  * Is a named pipe known?
  * @param[in] pipename         Just the filename
- * @result                     Do we want to serve this?
+ * @result                     NT error code
  */
-bool is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax)
+NTSTATUS is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax)
 {
        NTSTATUS status;
 
        if (strchr(pipename, '/')) {
-               DEBUG(1, ("Refusing open on pipe %s\n", pipename));
-               return false;
+               DBG_WARNING("Refusing open on pipe %s\n", pipename);
+               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
 
        if (lp_disable_spoolss() && strequal(pipename, "spoolss")) {
-               DEBUG(10, ("refusing spoolss access\n"));
-               return false;
+               DBG_DEBUG("refusing spoolss access\n");
+               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
 
        if (rpc_srv_get_pipe_interface_by_cli_name(pipename, syntax)) {
-               return true;
+               return NT_STATUS_OK;
        }
 
        status = smb_probe_module("rpc", pipename);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(10, ("is_known_pipename: %s unknown\n", pipename));
-               return false;
+               DBG_DEBUG("Unknown pipe '%s'\n", pipename);
+               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
-       DEBUG(10, ("is_known_pipename: %s loaded dynamically\n", pipename));
+       DBG_DEBUG("'%s' loaded dynamically\n", pipename);
 
        /*
         * Scan the list again for the interface id
         */
        if (rpc_srv_get_pipe_interface_by_cli_name(pipename, syntax)) {
-               return true;
+               return NT_STATUS_OK;
        }
 
-       DEBUG(10, ("is_known_pipename: pipe %s did not register itself!\n",
-                  pipename));
+       DBG_DEBUG("pipe %s did not register itself!\n", pipename);
 
-       return false;
+       return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 }
 
 /*******************************************************************
index 453cca18d9118d2ed65c16a494bd20353516e859..0a28f72d2412b098115f68ee9a8a0252c0aabc58 100644 (file)
@@ -28,6 +28,7 @@ struct pipes_struct;
 bool create_next_pdu(struct pipes_struct *p);
 bool api_pipe_bind_auth3(struct pipes_struct *p, struct ncacn_packet *pkt);
 bool setup_fault_pdu(struct pipes_struct *p, NTSTATUS status);
-bool is_known_pipename(const char *cli_filename, struct ndr_syntax_id *syntax);
+NTSTATUS is_known_pipename(const char *cli_filename,
+                          struct ndr_syntax_id *syntax);
 
 #endif /* _RPC_SERVER_SRV_PIPE_H_ */
index baa4ce96334d5cc826f2079a8da14f684d26a18d..963af1486a1ec5bd08aad8c2d729a360576ab811 100644 (file)
@@ -62,7 +62,6 @@ NTSTATUS np_open(TALLOC_CTX *mem_ctx, const char *name,
        struct ndr_syntax_id syntax;
        struct npa_state *npa = NULL;
        NTSTATUS status;
-       bool ok;
 
        proxy_list = lp_parm_string_list(-1, "np", "proxy", NULL);
 
@@ -99,9 +98,9 @@ NTSTATUS np_open(TALLOC_CTX *mem_ctx, const char *name,
                break;
        case RPC_SERVICE_MODE_EMBEDDED:
                /* Check if we handle this pipe internally */
-               ok = is_known_pipename(name, &syntax);
-               if (!ok) {
-                       DEBUG(2, ("'%s' is not a registered pipe!\n", name));
+               status = is_known_pipename(name, &syntax);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DBG_WARNING("'%s' is not a registered pipe!\n", name);
                        talloc_free(handle);
                        return NT_STATUS_OBJECT_NAME_NOT_FOUND;
                }
index 553f5309928502b0f34d9ad2ab5fb72865bccec6..161f7131e8e3a14af1c81d13e8f7c2e14d551639 100644 (file)
@@ -38,26 +38,26 @@ static int teardown_samr(void **state)
 static void test_is_known_pipename(void **state)
 {
        struct ndr_syntax_id syntax_id = ndr_table_samr.syntax_id;
-       bool is_pipename_ok;
+       NTSTATUS status;
 
-       is_pipename_ok = is_known_pipename("samr", &syntax_id);
-       assert_true(is_pipename_ok);
+       status = is_known_pipename("samr", &syntax_id);
+       assert_true(NT_STATUS_IS_OK(status));
 }
 
 static void test_is_known_pipename_slash(void **state)
 {
        struct ndr_syntax_id syntax_id = ndr_table_samr.syntax_id;
-       bool is_pipename_ok;
        char dummy_module_path[4096] = {0};
        const char *module_env;
+       NTSTATUS status;
 
        snprintf(dummy_module_path,
                 sizeof(dummy_module_path),
                 "%s/bin/modules/rpc/test_dummy_module.so",
                 SRCDIR);
 
-       is_pipename_ok = is_known_pipename(dummy_module_path, &syntax_id);
-       assert_false(is_pipename_ok);
+       status = is_known_pipename(dummy_module_path, &syntax_id);
+       assert_true(NT_STATUS_IS_ERR(status));
 
        module_env = getenv("UNITTEST_DUMMY_MODULE_LOADED");
        assert_null(module_env);