> No they don't > > If you specify a service type (ie. you don't send '?????' as the > service type) then windows will check that this service type matches > the service you are connecting to and will return > NT_STATUS_BAD_DEVICE_TYPE if it doesn't match.
Sent a wrong patch, sorry. > > It is very well possible that this also applies to the DISK and PRINTER > > share types, not only IPC. > > no, it doesn't apply to any of them Hmm. When you look at a sniff of TCONDEV then you see that for a file share W2k fills in "A:" if you ask it for ?????. Did not check printer though. Volker Index: smbd/service.c =================================================================== RCS file: /space/vl/cvstree/samba/source/smbd/service.c,v retrieving revision 1.117 diff -u -r1.117 service.c --- smbd/service.c 18 Mar 2003 23:51:18 -0000 1.117 +++ smbd/service.c 29 Mar 2003 12:28:16 -0000 @@ -227,22 +227,27 @@ 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: torture/torture.c =================================================================== RCS file: /space/vl/cvstree/samba/source/torture/torture.c,v retrieving revision 1.87 diff -u -r1.87 torture.c --- torture/torture.c 11 Mar 2003 06:53:44 -0000 1.87 +++ torture/torture.c 29 Mar 2003 12:29:01 -0000 @@ -975,6 +975,105 @@ 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 @@ -4118,6 +4217,7 @@ {"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},