svn commit: samba r22732 - in branches/SAMBA_3_0/source: include
libsmb
derrell at samba.org
derrell at samba.org
Mon May 7 03:07:41 GMT 2007
Author: derrell
Date: 2007-05-07 03:07:39 +0000 (Mon, 07 May 2007)
New Revision: 22732
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=22732
Log:
- Testing of libsmbclient against Vista revealed what is likely a bug in
Vista. Vista provides a plethora of kludges to simulate older versions of
Windows. The kludges are in the form of shortcuts (or more likely symbolic
links, but I don't know enough about Vista to determine that definitively)
and in most cases, attempts to access them get back an "access denied"
error. On one particular folder, however, "<share>/Users/All Users", it
returns an unknown (to ethereal and the Samba3 code) NT status code:
0x8000002d. Although this code does not have a high byte of 0xc0 indicating
that it is an error, it appears to be an alternate form of "access denied".
Without this patch, libsmbclient times out on an attempt to enumerate that
folder rather than returning an error to the caller. This patch corrects
that problem.
Modified:
branches/SAMBA_3_0/source/include/nterr.h
branches/SAMBA_3_0/source/libsmb/clierror.c
branches/SAMBA_3_0/source/libsmb/clitrans.c
Changeset:
Modified: branches/SAMBA_3_0/source/include/nterr.h
===================================================================
--- branches/SAMBA_3_0/source/include/nterr.h 2007-05-07 03:02:24 UTC (rev 22731)
+++ branches/SAMBA_3_0/source/include/nterr.h 2007-05-07 03:07:39 UTC (rev 22732)
@@ -30,6 +30,9 @@
#define STATUS_NO_MORE_FILES NT_STATUS(0x80000006)
#define NT_STATUS_NO_MORE_ENTRIES NT_STATUS(0x8000001a)
+/* Vista Status codes. */
+#define NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT NT_STATUS(0x8000002d)
+
#define STATUS_MORE_ENTRIES NT_STATUS(0x0105)
#define STATUS_SOME_UNMAPPED NT_STATUS(0x0107)
#define ERROR_INVALID_PARAMETER NT_STATUS(0x0057)
Modified: branches/SAMBA_3_0/source/libsmb/clierror.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/clierror.c 2007-05-07 03:02:24 UTC (rev 22731)
+++ branches/SAMBA_3_0/source/libsmb/clierror.c 2007-05-07 03:07:39 UTC (rev 22732)
@@ -385,6 +385,15 @@
return cli_errno_from_nt(status);
}
+ /*
+ * Yuck! A special case for this Vista error. Since its high-order
+ * byte isn't 0xc0, it doesn't match cli_is_nt_error() above.
+ */
+ status = cli_nt_error(cli);
+ if (NT_STATUS_V(status) == NT_STATUS_V(NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT)) {
+ return EACCES;
+ }
+
/* for other cases */
return EINVAL;
}
Modified: branches/SAMBA_3_0/source/libsmb/clitrans.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/clitrans.c 2007-05-07 03:02:24 UTC (rev 22731)
+++ branches/SAMBA_3_0/source/libsmb/clitrans.c 2007-05-07 03:07:39 UTC (rev 22732)
@@ -196,11 +196,18 @@
* returned when a trans2 findfirst/next finishes.
* When setting up an encrypted transport we can also
* see NT_STATUS_MORE_PROCESSING_REQUIRED here.
+ *
+ * Vista returns NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT if the folder
+ * "<share>/Users/All Users" is enumerated. This is a special pseudo
+ * folder, and the response does not have parameters (nor a parameter
+ * length).
*/
status = cli_nt_error(cli);
if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
- if (NT_STATUS_IS_ERR(status) || NT_STATUS_EQUAL(status,STATUS_NO_MORE_FILES)) {
+ if (NT_STATUS_IS_ERR(status) ||
+ NT_STATUS_EQUAL(status,STATUS_NO_MORE_FILES) ||
+ NT_STATUS_EQUAL(status,NT_STATUS_INACCESSIBLE_SYSTEM_SHORTCUT)) {
goto out;
}
}
More information about the samba-cvs
mailing list