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