diff options
author | Jeremy Allison <jra@samba.org> | 2009-11-02 12:53:46 -0800 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2009-12-23 12:07:29 +0100 |
commit | 6f04c300b05cda9e9d63dc91e0a8197982d1872e (patch) | |
tree | 90ec836b848348c029776cd6a09f608b7ce8c674 /source3/smbd/trans2.c | |
parent | 6f7cbab6b99f690588b80cfd4b7949ad392a5243 (diff) | |
download | samba-6f04c300b05cda9e9d63dc91e0a8197982d1872e.tar.gz samba-6f04c300b05cda9e9d63dc91e0a8197982d1872e.tar.xz samba-6f04c300b05cda9e9d63dc91e0a8197982d1872e.zip |
Fix bug 6867 - trans2findnext returns reply_nterror(req, ntstatus) In a directory with a lot of files. Jeremy.
(cherry picked from commit a6e7be60322b981f9eb81f2b686d28223bd735bc)
Diffstat (limited to 'source3/smbd/trans2.c')
-rw-r--r-- | source3/smbd/trans2.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 60924dfb239..bf3808e7046 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -2263,23 +2263,26 @@ static void call_trans2findnext(connection_struct *conn, requires_resume_key = (findnext_flags & FLAG_TRANS2_FIND_REQUIRE_RESUME); continue_bit = (findnext_flags & FLAG_TRANS2_FIND_CONTINUE); - srvstr_get_path_wcard(ctx, params, req->flags2, &resume_name, + if (!continue_bit) { + /* We only need resume_name if continue_bit is zero. */ + srvstr_get_path_wcard(ctx, params, req->flags2, &resume_name, params+12, total_params - 12, STR_TERMINATE, &ntstatus, &mask_contains_wcard); - if (!NT_STATUS_IS_OK(ntstatus)) { - /* Win9x or OS/2 can send a resume name of ".." or ".". This will cause the parser to - complain (it thinks we're asking for the directory above the shared - path or an invalid name). Catch this as the resume name is only compared, never used in - a file access. JRA. */ - srvstr_pull_talloc(ctx, params, req->flags2, + if (!NT_STATUS_IS_OK(ntstatus)) { + /* Win9x or OS/2 can send a resume name of ".." or ".". This will cause the parser to + complain (it thinks we're asking for the directory above the shared + path or an invalid name). Catch this as the resume name is only compared, never used in + a file access. JRA. */ + srvstr_pull_talloc(ctx, params, req->flags2, &resume_name, params+12, total_params - 12, STR_TERMINATE); - if (!resume_name || !(ISDOT(resume_name) || ISDOTDOT(resume_name))) { - reply_nterror(req, ntstatus); - return; + if (!resume_name || !(ISDOT(resume_name) || ISDOTDOT(resume_name))) { + reply_nterror(req, ntstatus); + return; + } } } @@ -2287,7 +2290,8 @@ static void call_trans2findnext(connection_struct *conn, close_after_request=%d, close_if_end = %d requires_resume_key = %d \ resume_key = %d resume name = %s continue=%d level = %d\n", dptr_num, max_data_bytes, maxentries, close_after_request, close_if_end, - requires_resume_key, resume_key, resume_name, continue_bit, info_level)); + requires_resume_key, resume_key, + resume_name ? resume_name : "(NULL)", continue_bit, info_level)); if (!maxentries) { /* W2K3 seems to treat zero as 1. */ @@ -2412,7 +2416,7 @@ total_data=%u (should be %u)\n", (unsigned int)total_data, (unsigned int)IVAL(pd * depend on the last file name instead. */ - if(*resume_name && !continue_bit) { + if(!continue_bit && resume_name && *resume_name) { SMB_STRUCT_STAT st; long current_pos = 0; |