mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
![Al Viro](/assets/img/avatar_default.png)
strndup(s, strlen(s)) is a highly unidiomatic way to spell strdup(s); it's *NOT* safer in any way, since strlen() is just as sensitive to NUL-termination as strdup() is. strndup() is for situations when you need a copy of a known-sized substring, not a magic security juju to drive the bad spirits away. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Steve French <stfrench@microsoft.com>
69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (C) 2020, Microsoft Corporation.
|
|
*
|
|
* Author(s): Steve French <stfrench@microsoft.com>
|
|
* Suresh Jayaraman <sjayaraman@suse.de>
|
|
* Jeff Layton <jlayton@kernel.org>
|
|
*/
|
|
|
|
#include <linux/fs.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/inet.h>
|
|
#include <linux/ctype.h>
|
|
#include "cifsglob.h"
|
|
#include "cifsproto.h"
|
|
|
|
/* extract the host portion of the UNC string */
|
|
char *extract_hostname(const char *unc)
|
|
{
|
|
const char *src;
|
|
char *dst, *delim;
|
|
unsigned int len;
|
|
|
|
/* skip double chars at beginning of string */
|
|
/* BB: check validity of these bytes? */
|
|
if (strlen(unc) < 3)
|
|
return ERR_PTR(-EINVAL);
|
|
for (src = unc; *src && *src == '\\'; src++)
|
|
;
|
|
if (!*src)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
/* delimiter between hostname and sharename is always '\\' now */
|
|
delim = strchr(src, '\\');
|
|
if (!delim)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
len = delim - src;
|
|
dst = kmalloc((len + 1), GFP_KERNEL);
|
|
if (dst == NULL)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
memcpy(dst, src, len);
|
|
dst[len] = '\0';
|
|
|
|
return dst;
|
|
}
|
|
|
|
char *extract_sharename(const char *unc)
|
|
{
|
|
const char *src;
|
|
char *delim, *dst;
|
|
|
|
/* skip double chars at the beginning */
|
|
src = unc + 2;
|
|
|
|
/* share name is always preceded by '\\' now */
|
|
delim = strchr(src, '\\');
|
|
if (!delim)
|
|
return ERR_PTR(-EINVAL);
|
|
delim++;
|
|
|
|
/* caller has to free the memory */
|
|
dst = kstrdup(delim, GFP_KERNEL);
|
|
if (!dst)
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
return dst;
|
|
}
|