[linux-cifs-client] [PATCH 05/12] cifs: rename cifs_strlcpy_to_host and make it use new functions

Shirish Pargaonkar shirishpargaonkar at gmail.com
Wed Apr 29 20:06:56 GMT 2009


On Wed, Apr 29, 2009 at 2:32 PM, Jeff Layton <jlayton at redhat.com> wrote:
> On Wed, 29 Apr 2009 12:47:00 -0500
> Shirish Pargaonkar <shirishpargaonkar at gmail.com> wrote:
>
>> On Wed, Apr 29, 2009 at 12:25 PM, Jeff Layton <jlayton at redhat.com> wrote:
>> > Rename cifs_strlcpy_to_host to cifs_strldup_to_host since that better
>> > describes what this function really does. Then, convert it to use the
>> > new string conversion and measurement functions that work in units of
>> > bytes rather than wide chars.
>> >
>> > Signed-off-by: Jeff Layton <jlayton at redhat.com>
>> > ---
>> >  fs/cifs/cifs_unicode.c |   41 +++++++++++++++++++++++++++++++++++++++++
>> >  fs/cifs/cifs_unicode.h |    3 +++
>> >  fs/cifs/cifssmb.c      |   48 +++++++-----------------------------------------
>> >  3 files changed, 51 insertions(+), 41 deletions(-)
>> >
>> > diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c
>> > index 29db445..e325d3d 100644
>> > --- a/fs/cifs/cifs_unicode.c
>> > +++ b/fs/cifs/cifs_unicode.c
>> > @@ -245,3 +245,44 @@ cifs_strtoUCS(__le16 *to, const char *from, int len,
>> >        return i;
>> >  }
>> >
>> > +/*
>> > + * cifs_strldup_to_host - copy a string from wire format to the local codepage
>> > + * @dst - pointer to pointer of destination string
>> > + * @src - source string
>> > + * @maxlen - don't walk past this many bytes in the source string
>> > + * @is_unicode - is this a unicode string?
>> > + * @codepage - destination codepage
>> > + *
>> > + * Take a string given by the server, covert it to the local codepage and
>> > + * put it in a new buffer. Returns length of the new buffer in bytes or a
>> > + * negative error code. A pointer to the new buffer is placed into *dst.
>> > + */
>> > +int
>> > +cifs_strldup_to_host(char **dst, const char *src, const int maxlen,
>> > +                    const bool is_unicode, const struct nls_table *codepage)
>>
>> While translating and copying the string received on the wire to the
>> string in the local charset,
>> does cifs not have to worrry about mapchars (value of remap) mount
>> option since cifs_from_ucs2le
>> does use mapchar variable or it does not matter so mapchars value
>> while calling cifs_from_ucs2le
>> be always false?
>>
>
> The strings that this function copies are not always (and in fact, are
> seldom) paths.
>
> The existing code outside of the readdir codepath doesn't care, so I'm
> not planning to worry about it here. That can be fixed later if there's
> a need for it.
>
>> > +{
>> > +       int len;
>> > +
>> > +       if (is_unicode) {
>> > +               len = cifs_ucs2le_bytes((__le16 *) src, maxlen, codepage);
>> > +               len += nls_nullsize(codepage);
>> > +               *dst = kmalloc(len, GFP_KERNEL);
>> > +               if (!*dst)
>> > +                       goto err_exit;
>> > +               cifs_from_ucs2le(*dst, (__le16 *) src, len, maxlen, codepage,
>> > +                                false);
>> > +       } else {
>> > +               len = strnlen(src, maxlen);
>> > +               len++;
>> > +               *dst = kmalloc(len, GFP_KERNEL);
>> > +               if (!*dst)
>> > +                       goto err_exit;
>> > +               strlcpy(*dst, src, len);
>> > +       }
>> > +       return len;
>> > +
>> > +err_exit:
>> > +       cERROR(1, ("Failed to allocate buffer for string\n"));
>> > +       return -ENOMEM;
>> > +}
>> > +
>> > diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h
>> > index ef7b907..2ec6375 100644
>> > --- a/fs/cifs/cifs_unicode.h
>> > +++ b/fs/cifs/cifs_unicode.h
>> > @@ -78,6 +78,9 @@ int cifs_from_ucs2le(char *to, const __le16 *from, int tolen, int fromlen,
>> >                     const struct nls_table *codepage, bool mapchar);
>> >  int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *);
>> >  int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
>> > +int cifs_strldup_to_host(char **dst, const char *src, const int maxlen,
>> > +                        const bool is_unicode,
>> > +                        const struct nls_table *codepage);
>> >  #endif
>> >
>> >  /*
>> > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
>> > index 33e433b..17c4ba9 100644
>> > --- a/fs/cifs/cifssmb.c
>> > +++ b/fs/cifs/cifssmb.c
>> > @@ -81,41 +81,6 @@ static struct {
>> >  #endif /* CONFIG_CIFS_WEAK_PW_HASH */
>> >  #endif /* CIFS_POSIX */
>> >
>> > -/* Allocates buffer into dst and copies smb string from src to it.
>> > - * caller is responsible for freeing dst if function returned 0.
>> > - * returns:
>> > - *     on success - 0
>> > - *     on failure - errno
>> > - */
>> > -static int
>> > -cifs_strlcpy_to_host(char **dst, const char *src, const int maxlen,
>> > -                const bool is_unicode, const struct nls_table *nls_codepage)
>> > -{
>> > -       int plen;
>> > -
>> > -       if (is_unicode) {
>> > -               plen = UniStrnlen((wchar_t *)src, maxlen);
>> > -               *dst = kmalloc((4 * plen) + 2, GFP_KERNEL);
>> > -               if (!*dst)
>> > -                       goto cifs_strlcpy_to_host_ErrExit;
>> > -               cifs_strfromUCS_le(*dst, (__le16 *)src, plen, nls_codepage);
>> > -               (*dst)[plen] = 0;
>> > -               (*dst)[plen+1] = 0; /* needed for Unicode */
>> > -       } else {
>> > -               plen = strnlen(src, maxlen);
>> > -               *dst = kmalloc(plen + 2, GFP_KERNEL);
>> > -               if (!*dst)
>> > -                       goto cifs_strlcpy_to_host_ErrExit;
>> > -               strlcpy(*dst, src, plen);
>> > -       }
>> > -       return 0;
>> > -
>> > -cifs_strlcpy_to_host_ErrExit:
>> > -       cERROR(1, ("Failed to allocate buffer for string\n"));
>> > -       return -ENOMEM;
>> > -}
>> > -
>> > -
>> >  /* Mark as invalid, all open files on tree connections since they
>> >    were closed when session to server was lost */
>> >  static void mark_open_files_invalid(struct cifsTconInfo *pTcon)
>> > @@ -4008,19 +3973,20 @@ parse_DFS_referrals(TRANSACTION2_GET_DFS_REFER_RSP *pSMBr,
>> >                /* copy DfsPath */
>> >                temp = (char *)ref + le16_to_cpu(ref->DfsPathOffset);
>> >                max_len = data_end - temp;
>> > -               rc = cifs_strlcpy_to_host(&(node->path_name), temp,
>> > -                                       max_len, is_unicode, nls_codepage);
>> > -               if (rc)
>> > +               rc = cifs_strldup_to_host(&node->path_name, temp, max_len,
>> > +                                         is_unicode, nls_codepage);
>> > +               if (rc < 0)
>> >                        goto parse_DFS_referrals_exit;
>> >
>> >                /* copy link target UNC */
>> >                temp = (char *)ref + le16_to_cpu(ref->NetworkAddressOffset);
>> >                max_len = data_end - temp;
>> > -               rc = cifs_strlcpy_to_host(&(node->node_name), temp,
>> > -                                       max_len, is_unicode, nls_codepage);
>> > -               if (rc)
>> > +               rc = cifs_strldup_to_host(&node->node_name, temp, max_len,
>> > +                                         is_unicode, nls_codepage);
>> > +               if (rc < 0)
>> >                        goto parse_DFS_referrals_exit;
>> >
>> > +               rc = 0;
>> >                ref += le16_to_cpu(ref->Size);
>> >        }
>> >
>> > --
>> > 1.6.0.6
>> >
>> > _______________________________________________
>> > linux-cifs-client mailing list
>> > linux-cifs-client at lists.samba.org
>> > https://lists.samba.org/mailman/listinfo/linux-cifs-client
>> >
>
>
> --
> Jeff Layton <jlayton at redhat.com>
>

Jeff,

OK.  Let me look at this more, the reason I was concerned was I
remebered samba bugzilla bug 4277.

Regards,

Shirish


More information about the linux-cifs-client mailing list