Re: Re: [PATCH 00/12] cifs: fix string conversions from wire format to local charset (try #3)
Steve French <[email protected]>
| Newsgroups | gmane.linux.file-systems.cifs |
|---|---|
| Message-ID | <[email protected]> |
Forgot to cc the list On Thu, Apr 30, 2009 at 6:48 PM, Steve French <[email protected]> wrote: > On Thu, Apr 30, 2009 at 5:55 PM, Jeff Layton <[email protected]> wrote: >> On Thu, 30 Apr 2009 16:39:25 -0500 >> Steve French <[email protected]> wrote: >> >>> Have merged Jeff's fixes (minus the two which don't fix string conversions). >>> >>> I removed the dead code in sessionsetup functions in connect.c (about >>> 450 lines), except the 2 ntlmssp functions which I will rewrite >>> tonight or tomorrow, but there are some problems that the patch >>> testing uncovered: >>> >>> 1) readdir (findfirst level 257, in which strings are length delimited >>> rather than null terminated) doesn't seem to handle files which are >>> not null terminated (causing extra characters to appear at the end of >>> some file names) >>> >> >> That's probably my fault. I think the old code used the length that it >> got from the server calculate the length that it passed to >> cifs_strfromUCS_le. I assumed that the string would be null terminated >> and figured that it would be safer to pass in the distance to the end >> of the response as a max length. We probably just need to change it to >> use: >> >> min(length_from_server, distance_to_end_of_packet) >> >> That should do the right thing and still be safe. I'll code up a patch >> later tonight or tomorrow that does that and test it out. > > The code that changed was in fs/cifs/readdir.c > > - pqst->len = cifs_strfromUCS_le((char *)pqst->name, > - (__le16 *)filename, len/2, nlt); > + pqst->len = cifs_from_ucs2((char *) pqst->name, > + (__le16 *) filename, > + UNICODE_NAME_MAX, max_len, nlt, > + cifs_sb->mnt_cifs_flags & > + CIFS_MOUNT_MAP_SPECIAL_CHR); > > So min of max_len and len should be fine. I simply changed max_len to len and that seems to work. -- Thanks, Steve