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