summaryrefslogtreecommitdiff
path: root/source3/libsmb/clierror.c
diff options
context:
space:
mode:
authorDerrell Lipman <derrell@samba.org>2007-05-07 03:07:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:21:52 -0500
commitd1153fc79076741571b203b1d70f1536bde208f0 (patch)
treeefc5ec5e5ceaab8398760a3dea3421143bf86f83 /source3/libsmb/clierror.c
parent3a9a3ad8f9ead7ec963103f8ee0fe905f3982913 (diff)
downloadsamba-d1153fc79076741571b203b1d70f1536bde208f0.tar.gz
samba-d1153fc79076741571b203b1d70f1536bde208f0.tar.bz2
samba-d1153fc79076741571b203b1d70f1536bde208f0.zip
r22732: - 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. (This used to be commit cc0cd3a12f76b8cd711e3165d4cfe920552f256d)
Diffstat (limited to 'source3/libsmb/clierror.c')
-rw-r--r--source3/libsmb/clierror.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/source3/libsmb/clierror.c b/source3/libsmb/clierror.c
index 4b222c9015..d98f428217 100644
--- a/source3/libsmb/clierror.c
+++ b/source3/libsmb/clierror.c
@@ -385,6 +385,15 @@ int cli_errno(struct cli_state *cli)
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;
}