s3:smb2_find: Return that timestamps do not exist as directories
authorChristof Schmitt <christof.schmitt@us.ibm.com>
Thu, 29 Aug 2013 17:36:00 +0000 (19:36 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 10 Sep 2013 20:38:50 +0000 (22:38 +0200)
When a Windows client receives a large directory listing while
querying snapshots, it sends a find request asking for the
timestamp as a directory. A Windows server returns NO_SUCH_FILE,
so make sure Samba returns the same. Otherwise the client will
get confused and display timestamps in the 'previous versions' dialog.

Signed-off-by: Christof Schmitt <christof.schmitt@us.ibm.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Tue Sep 10 22:38:51 CEST 2013 on sn-devel-104

source3/include/smb.h
source3/modules/vfs_shadow_copy2.c
source3/smbd/smb2_find.c

index b6b04a4d9ba4aa28ff4a8aece50cfee4cf2ac429..12882221e32f6ee37f29cc545b411d62d445e380 100644 (file)
@@ -567,6 +567,9 @@ Offset  Data                        length.
 #define NOTIFY_ACTION_REMOVED_STREAM 7
 #define NOTIFY_ACTION_MODIFIED_STREAM 8
 
+/* timestamp format used in "previous versions" */
+#define GMT_NAME_LEN 24 /* length of a @GMT- name */
+#define GMT_FORMAT "@GMT-%Y.%m.%d-%H.%M.%S"
 
 /* where to find the base of the SMB packet proper */
 #define smb_base(buf) (((const char *)(buf))+4)
index 60f96286003e0383d5244858d73e24c6b04f30db..aa7e50ff510d44dbc81eff43bd2b79839bd9704b 100644 (file)
 #include <ccan/hash/hash.h>
 #include "util_tdb.h"
 
-#define GMT_NAME_LEN 24 /* length of a @GMT- name */
-#define GMT_FORMAT "@GMT-%Y.%m.%d-%H.%M.%S"
-
 static bool shadow_copy2_find_slashes(TALLOC_CTX *mem_ctx, const char *str,
                                      size_t **poffsets,
                                      unsigned *pnum_offsets)
index c2c0559371ee3e1153416388481e0ca96820e0ad..c39a35d526cd1aaf1929733bde9628a0087d10db 100644 (file)
@@ -224,6 +224,8 @@ static struct tevent_req *smbd_smb2_find_send(TALLOC_CTX *mem_ctx,
        uint32_t dirtype = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY;
        bool dont_descend = false;
        bool ask_sharemode = true;
+       struct tm tm;
+       char *p;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct smbd_smb2_find_state);
@@ -259,6 +261,17 @@ static struct tevent_req *smbd_smb2_find_send(TALLOC_CTX *mem_ctx,
                return tevent_req_post(req, ev);
        }
 
+       p = strptime(in_file_name, GMT_FORMAT, &tm);
+       if ((p != NULL) && (*p =='\0')) {
+               /*
+                * Bogus find that asks for a shadow copy timestamp as a
+                * directory. The correct response is that it does not exist as
+                * a directory.
+                */
+               tevent_req_nterror(req, NT_STATUS_NO_SUCH_FILE);
+               return tevent_req_post(req, ev);
+       }
+
        if (in_output_buffer_length > smb2req->sconn->smb2.max_trans) {
                DEBUG(2,("smbd_smb2_find_send: "
                         "client ignored max trans:%s: 0x%08X: 0x%08X\n",