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);
 	}
 
