This changes our handling of invalid service types that the
authorVolker Lendecke <vlendec@samba.org>
Sun, 30 Mar 2003 16:36:21 +0000 (16:36 +0000)
committerVolker Lendecke <vlendec@samba.org>
Sun, 30 Mar 2003 16:36:21 +0000 (16:36 +0000)
client requested on tconx. We now return the same error
code like NT4SP6 and W2kSP3 return.

TCONDEV is a little test for this.

Volker
(This used to be commit 6ab88f31d6773f16baff8421ec9e530461cc8f93)

source3/smbd/service.c
source3/torture/torture.c

index f67361e66a3db4f5c3652f943352fe4bc80c9ad3..5c87eb0729bc366d2f06cc23bb3dfe0191435073 100644 (file)
@@ -227,22 +227,27 @@ static NTSTATUS share_sanity_checks(int snum, fstring dev)
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       /* you can only connect to the IPC$ service as an ipc device */
-       if (strequal(lp_fstype(snum), "IPC"))
-               fstrcpy(dev,"IPC");
-       
        if (dev[0] == '?' || !dev[0]) {
                if (lp_print_ok(snum)) {
                        fstrcpy(dev,"LPT1:");
+               } else if (strequal(lp_fstype(snum), "IPC")) {
+                       fstrcpy(dev, "IPC");
                } else {
                        fstrcpy(dev,"A:");
                }
        }
 
-       /* if the request is as a printer and you can't print then refuse */
        strupper(dev);
-       if (!lp_print_ok(snum) && (strncmp(dev,"LPT",3) == 0)) {
-               DEBUG(1,("Attempt to connect to non-printer as a printer\n"));
+
+       if (lp_print_ok(snum)) {
+               if (!strequal(dev, "LPT:")) {
+                       return NT_STATUS_BAD_DEVICE_TYPE;
+               }
+       } else if (strequal(lp_fstype(snum), "IPC")) {
+               if (!strequal(dev, "IPC")) {
+                       return NT_STATUS_BAD_DEVICE_TYPE;
+               }
+       } else if (!strequal(dev, "A:")) {
                return NT_STATUS_BAD_DEVICE_TYPE;
        }
 
index a7607aae6c246be900e2109c1613962bc6551099..d6ae58c522c0231cb9d27d82a747fe9c8774eef5 100644 (file)
@@ -1043,6 +1043,105 @@ static BOOL run_tcon2_test(int dummy)
        return True;
 }
 
+static BOOL tcon_devtest(struct cli_state *cli,
+                        const char *myshare, const char *devtype,
+                        NTSTATUS expected_error)
+{
+       BOOL status;
+       BOOL ret;
+
+       status = cli_send_tconX(cli, myshare, devtype,
+                               password, strlen(password)+1);
+
+       if (NT_STATUS_IS_OK(expected_error)) {
+               if (status) {
+                       ret = True;
+               } else {
+                       printf("tconX to share %s with type %s "
+                              "should have succeeded but failed\n",
+                              myshare, devtype);
+                       ret = False;
+               }
+               cli_tdis(cli);
+       } else {
+               if (status) {
+                       printf("tconx to share %s with type %s "
+                              "should have failed but succeeded\n",
+                              myshare, devtype);
+                       ret = False;
+               } else {
+                       if (NT_STATUS_EQUAL(cli_nt_error(cli),
+                                           expected_error)) {
+                               ret = True;
+                       } else {
+                               printf("Returned unexpected error\n");
+                               ret = False;
+                       }
+               }
+       }
+       return ret;
+}
+
+/*
+ checks for correct tconX support
+ */
+static BOOL run_tcon_devtype_test(int dummy)
+{
+       static struct cli_state *cli1 = NULL;
+       BOOL retry;
+       int flags = 0;
+       NTSTATUS status;
+       BOOL ret;
+
+       status = cli_full_connection(&cli1, myname,
+                                    host, NULL, port_to_use,
+                                    NULL, NULL,
+                                    username, workgroup,
+                                    password, flags, &retry);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("could not open connection\n");
+               return False;
+       }
+
+       if (!tcon_devtest(cli1, "IPC$", "A:", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+
+       if (!tcon_devtest(cli1, "IPC$", "?????", NT_STATUS_OK))
+               ret = False;
+
+       if (!tcon_devtest(cli1, "IPC$", "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+
+       if (!tcon_devtest(cli1, "IPC$", "IPC", NT_STATUS_OK))
+               ret = False;
+                       
+       if (!tcon_devtest(cli1, "IPC$", "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+
+       if (!tcon_devtest(cli1, share, "A:", NT_STATUS_OK))
+               ret = False;
+
+       if (!tcon_devtest(cli1, share, "?????", NT_STATUS_OK))
+               ret = False;
+
+       if (!tcon_devtest(cli1, share, "LPT:", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+
+       if (!tcon_devtest(cli1, share, "IPC", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+                       
+       if (!tcon_devtest(cli1, share, "FOOBA", NT_STATUS_BAD_DEVICE_TYPE))
+               ret = False;
+
+       cli_shutdown(cli1);
+
+       if (ret)
+               printf("Passed tcondevtest\n");
+
+       return ret;
+}
+
 
 /*
   This test checks that 
@@ -4326,6 +4425,7 @@ static struct {
        {"DENY1",  torture_denytest1, 0},
        {"DENY2",  torture_denytest2, 0},
        {"TCON",  run_tcon_test, 0},
+       {"TCONDEV",  run_tcon_devtype_test, 0},
        {"RW1",  run_readwritetest, 0},
        {"RW2",  run_readwritemulti, FLAG_MULTIPROC},
        {"RW3",  run_readwritelarge, 0},