---------- Forwarded message --------- From: Boris Protopopov <boris.v.protopopov@xxxxxxxxx> Date: Tue, Sep 29, 2020 at 1:51 PM Subject: Re: Fwd: [PATCH] Convert trailing spaces and periods in path components To: Tom Talpey <tom@xxxxxxxxxx> Windows Server 2019, should have mentioned above. On Tue, Sep 29, 2020 at 1:23 PM Tom Talpey <tom@xxxxxxxxxx> wrote: > > What was the server for these tests? > > On 9/29/2020 1:08 PM, Boris Protopopov wrote: > > Testing: > > > > Prior to the patch: > > > > % mount -v > > … > > //host/share/home on /tmp/diry type cifs (rw,relatime,vers=default,... > > % ls -l /tmp/diry/tmp > > total 0 > > % mkdir /tmp/diry/tmp/DirWithTrailingDot. > > % ls -l /tmp/diry/tmp/DirWithTrailingDot. > > total 0 > > % touch /tmp/diry/tmp/DirWithTrailingDot./file > > touch: cannot touch ‘/tmp/diry/tmp/DirWithTrailingDot./file’: No such > > file or directory > > % mkdir /tmp/diry/tmp/DirWithTrailingDot./dir > > mkdir: cannot create directory > > ‘/tmp/diry/tmp/DirWithTrailingDot./dir’: No such file or directory > > % find /tmp/diry/tmp/DirWithTrailingDot. > > /tmp/diry/tmp/DirWithTrailingDot. > > % find /tmp/diry/tmp/DirWithTrailingSpace\ > > find: `/tmp/diry/tmp/DirWithTrailingSpace ': No such file or directory > > % mkdir /tmp/diry/tmp/DirWithTrailingSpace\ > > % ls -l /tmp/diry/tmp/DirWithTrailingSpace\ > > total 0 > > % touch /tmp/diry/tmp/DirWithTrailingSpace\ /file > > touch: cannot touch ‘/tmp/diry/tmp/DirWithTrailingSpace /file’: No > > such file or directory > > % mkdir /tmp/diry/tmp/DirWithTrailingSpace\ /dir > > mkdir: cannot create directory ‘/tmp/diry/tmp/DirWithTrailingSpace > > /dir’: No such file or directory > > > > After the patch: > > > > % umount /tmp/diry > > % modprobe -r cifs > > # load the fix > > % modprobe cifs > > % mount -t cifs -o... //host/share/home /tmp/diry > > ... > > % mkdir /tmp/diry/tmp/DirWithTrailingSpace\ /dir > > % touch /tmp/diry/tmp/DirWithTrailingSpace\ /file > > % mkdir /tmp/diry/tmp/DirWithTrailingDot./dir > > % touch /tmp/diry/tmp/DirWithTrailingDot./file > > % find /tmp/diry/tmp/ > > /tmp/diry/tmp/ > > /tmp/diry/tmp/DirWithTrailingDot. > > /tmp/diry/tmp/DirWithTrailingDot./dir > > /tmp/diry/tmp/DirWithTrailingDot./file > > /tmp/diry/tmp/DirWithTrailingSpace > > /tmp/diry/tmp/DirWithTrailingSpace /dir > > /tmp/diry/tmp/DirWithTrailingSpace /file > > % rm -rf /tmp/diry/tmp/* > > % find /tmp/diry/tmp/ > > /tmp/diry/tmp/ > > > > ---------- Forwarded message --------- > > From: Boris Protopopov <pboris@xxxxxxxxxx> > > Date: Wed, Sep 23, 2020 at 8:39 PM > > Subject: [PATCH] Convert trailing spaces and periods in path components > > To: > > Cc: <linux-cifs@xxxxxxxxxxxxxxx>, <samba-technical@xxxxxxxxxxxxxxx>, > > Boris Protopopov <pboris@xxxxxxxxxx> > > > > > > When converting trailing spaces and periods in paths, do so > > for every component of the path, not just the last component. > > If the conversion is not done for every path component, then > > subsequent operations in directories with trailing spaces or > > periods (e.g. create(), mkdir()) will fail with ENOENT. This > > is because on the server, the directory will have a special > > symbol in its name, and the client needs to provide the same. > > > > Signed-off-by: Boris Protopopov <pboris@xxxxxxxxxx> > > --- > > fs/cifs/cifs_unicode.c | 8 +++++++- > > 1 file changed, 7 insertions(+), 1 deletion(-) > > > > diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c > > index 498777d859eb..9bd03a231032 100644 > > --- a/fs/cifs/cifs_unicode.c > > +++ b/fs/cifs/cifs_unicode.c > > @@ -488,7 +488,13 @@ cifsConvertToUTF16(__le16 *target, const char > > *source, int srclen, > > else if (map_chars == SFM_MAP_UNI_RSVD) { > > bool end_of_string; > > > > - if (i == srclen - 1) > > + /** > > + * Remap spaces and periods found at the end of every > > + * component of the path. The special cases of '.' and > > + * '..' do not need to be dealt with explicitly because > > + * they are addressed in namei.c:link_path_walk(). > > + **/ > > + if ((i == srclen - 1) || (source[i+1] == '\\')) > > end_of_string = true; > > else > > end_of_string = false; > > -- > > 2.18.4 > > > >