diff options
-rw-r--r-- | source3/include/smb.h | 3 | ||||
-rw-r--r-- | source3/modules/vfs_shadow_copy2.c | 3 | ||||
-rw-r--r-- | source3/smbd/smb2_find.c | 13 |
3 files changed, 16 insertions, 3 deletions
diff --git a/source3/include/smb.h b/source3/include/smb.h index b6b04a4d9b..12882221e3 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -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) diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 60f9628600..aa7e50ff51 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -107,9 +107,6 @@ #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) diff --git a/source3/smbd/smb2_find.c b/source3/smbd/smb2_find.c index c2c0559371..c39a35d526 100644 --- a/source3/smbd/smb2_find.c +++ b/source3/smbd/smb2_find.c @@ -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", |