[PATCH] Fix bug #10650 - "case sensitive = True" option doesn't work with "max protocol = SMB2" or higher in large directories.

Ira Cooper ira at samba.org
Wed Jun 11 08:16:55 MDT 2014


Reviewed-by: Ira Cooper <ira at samba.org>

On the entire series, Jeremy or Volker, you wish to do the honors?

Thanks.

-Ira


On Wed, Jun 11, 2014 at 2:39 AM, Volker Lendecke <Volker.Lendecke at sernet.de>
wrote:

> Hi!
>
> Attached find your patches with my r-b. Also find two
> more-or-less cosmetic patches on top.
>
> Please review and/or push!
>
> Thanks,
>
> Volker
>
> On Tue, Jun 10, 2014 at 04:16:18PM -0700, Jeremy Allison wrote:
> > Here's a fix for the SMB2/3 server when given a non-wildcard
> > search path.
> >
> > For a non-wildcard string we need it to go through the
> > filename_convert() function that takes care of name
> > canonicalization and lookup in the same way as any
> > other given pathname.
> >
> > This is the same way it's done in the old SMB1 trans2
> > findfirst code.
> >
> > Please review and/or push if you're happy.
> >
> > Thanks !
> >
> > Jeremy.
>
> > From c997a4a4a40f9f8f7755e60be783de106371caec Mon Sep 17 00:00:00 2001
> > From: Jeremy Allison <jra at samba.org>
> > Date: Tue, 10 Jun 2014 14:41:45 -0700
> > Subject: [PATCH 1/2] s3: smbd - SMB[2|3]. Ensure a \ or / can't be found
> >  anywhere in a search path, not just at the start.
> >
> > Signed-off-by: Jeremy Allison <jra at samba.org>
> > ---
> >  source3/smbd/smb2_find.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/source3/smbd/smb2_find.c b/source3/smbd/smb2_find.c
> > index 3f779b8..d66c093 100644
> > --- a/source3/smbd/smb2_find.c
> > +++ b/source3/smbd/smb2_find.c
> > @@ -252,11 +252,11 @@ static struct tevent_req
> *smbd_smb2_find_send(TALLOC_CTX *mem_ctx,
> >               tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_INVALID);
> >               return tevent_req_post(req, ev);
> >       }
> > -     if (strcmp(in_file_name, "\\") == 0) {
> > +     if (strchr_m(in_file_name, '\\') != NULL) {
> >               tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_INVALID);
> >               return tevent_req_post(req, ev);
> >       }
> > -     if (strcmp(in_file_name, "/") == 0) {
> > +     if (strchr_m(in_file_name, '/') != NULL) {
> >               tevent_req_nterror(req, NT_STATUS_OBJECT_NAME_INVALID);
> >               return tevent_req_post(req, ev);
> >       }
> > --
> > 2.0.0.526.g5318336
> >
> >
> > From f5a1dde50b0328965c859c39a61b79cf88a363e7 Mon Sep 17 00:00:00 2001
> > From: Jeremy Allison <jra at samba.org>
> > Date: Tue, 10 Jun 2014 15:58:15 -0700
> > Subject: [PATCH 2/2] s3: smbd : SMB2 - fix SMB2_SEARCH when searching non
> >  wildcard string with a case-canonicalized share.
> >
> > We need to go through filename_convert() in order for the filename
> > canonicalization to be done on a non-wildcard search string (as is
> > done in the SMB1 findfirst code path).
> >
> > Fixes Bug #10650 - "case sensitive = True" option doesn't work with "max
> protocol = SMB2" or higher in large directories.
> >
> > https://bugzilla.samba.org/show_bug.cgi?id=10650
> >
> > Signed-off-by: Jeremy Allison <jra at samba.org>
> > ---
> >  source3/smbd/smb2_find.c | 37 ++++++++++++++++++++++++++++++++++---
> >  1 file changed, 34 insertions(+), 3 deletions(-)
> >
> > diff --git a/source3/smbd/smb2_find.c b/source3/smbd/smb2_find.c
> > index d66c093..e9e0542 100644
> > --- a/source3/smbd/smb2_find.c
> > +++ b/source3/smbd/smb2_find.c
> > @@ -224,6 +224,7 @@ 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;
> > +     bool wcard_has_wild;
> >       struct tm tm;
> >       char *p;
> >
> > @@ -323,11 +324,41 @@ static struct tevent_req
> *smbd_smb2_find_send(TALLOC_CTX *mem_ctx,
> >               dptr_CloseDir(fsp);
> >       }
> >
> > -     if (fsp->dptr == NULL) {
> > -             bool wcard_has_wild;
> > +     wcard_has_wild = ms_has_wild(in_file_name);
> >
> > -             wcard_has_wild = ms_has_wild(in_file_name);
> > +     /* Ensure we've canonicalized any search path if not a wildcard. */
> > +     if (!wcard_has_wild) {
> > +             struct smb_filename *smb_fname = NULL;
> > +             const char *fullpath;
> >
> > +             if (ISDOT(fsp->fsp_name->base_name)) {
> > +                     fullpath = in_file_name;
> > +             } else {
> > +                     fullpath = talloc_asprintf(state,
> > +                                     "%s/%s",
> > +                                     fsp->fsp_name->base_name,
> > +                                     in_file_name);
> > +             }
> > +             if (tevent_req_nomem(fullpath, req)) {
> > +                     return tevent_req_post(req, ev);
> > +             }
> > +             status = filename_convert(state,
> > +                             conn,
> > +                             false, /* Not a DFS path. */
> > +                             fullpath,
> > +                             UCF_SAVE_LCOMP |
> UCF_ALWAYS_ALLOW_WCARD_LCOMP,
> > +                             &wcard_has_wild,
> > +                             &smb_fname);
> > +
> > +             if (!NT_STATUS_IS_OK(status)) {
> > +                     tevent_req_nterror(req, status);
> > +                     return tevent_req_post(req, ev);
> > +             }
> > +
> > +             in_file_name = smb_fname->original_lcomp;
> > +     }
> > +
> > +     if (fsp->dptr == NULL) {
> >               status = dptr_create(conn,
> >                                    NULL, /* req */
> >                                    fsp,
> > --
> > 2.0.0.526.g5318336
> >
>
>
> --
> SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
> phone: +49-551-370000-0, fax: +49-551-370000-9
> AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
> http://www.sernet.de, mailto:kontakt at sernet.de
>


More information about the samba-technical mailing list