From patchwork Wed Apr 29 13:29:15 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 20716 Received: from lists.samba.org (mail.samba.org [66.70.73.150]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n3TDUHlQ032729 for ; Wed, 29 Apr 2009 13:30:17 GMT Received: from dp.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 452E2163C43 for ; Wed, 29 Apr 2009 13:29:54 +0000 (GMT) X-Spam-Checker-Version: SpamAssassin 3.1.7 (2006-10-05) on dp.samba.org X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.8 tests=AWL,BAYES_00, FORGED_RCVD_HELO,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.1.7 X-Original-To: linux-cifs-client@lists.samba.org Delivered-To: linux-cifs-client@lists.samba.org Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by lists.samba.org (Postfix) with ESMTP id 76558163C0E for ; Wed, 29 Apr 2009 13:29:04 +0000 (GMT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n3TDTQYN027908; Wed, 29 Apr 2009 09:29:26 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n3TDTP0H001797; Wed, 29 Apr 2009 09:29:25 -0400 Received: from localhost.localdomain (vpn-12-35.rdu.redhat.com [10.11.12.35]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n3TDTKJA008654; Wed, 29 Apr 2009 09:29:24 -0400 From: Jeff Layton To: linux-cifs-client@lists.samba.org Date: Wed, 29 Apr 2009 09:29:15 -0400 Message-Id: <1241011759-7632-6-git-send-email-jlayton@redhat.com> In-Reply-To: <1241011759-7632-1-git-send-email-jlayton@redhat.com> References: <1241011759-7632-1-git-send-email-jlayton@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 Cc: smfrench@gmail.com, sjayaraman@suse.de, eugene@redhat.com Subject: [linux-cifs-client] [PATCH 05/10] cifs: rename cifs_strlcpy_to_host and make it use new functions X-BeenThere: linux-cifs-client@lists.samba.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: The Linux CIFS VFS client List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-cifs-client-bounces+patchwork-cifs-client=patchwork.kernel.org@lists.samba.org Errors-To: linux-cifs-client-bounces+patchwork-cifs-client=patchwork.kernel.org@lists.samba.org 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 --- 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 adb8e1f..da73cda 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c @@ -240,3 +240,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) +{ + int len; + + if (is_unicode) { + len = cifs_utf16le_bytes((__le16 *) src, maxlen, codepage); + len += null_charlen(codepage); + *dst = kmalloc(len, GFP_KERNEL); + if (!*dst) + goto err_exit; + cifs_utf16le_to_host(*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 9f1b91e..4937fa5 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h @@ -78,6 +78,9 @@ int cifs_utf16le_to_host(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 256b5fe..6de17ef 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); }