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