linux/fs/cifs/unc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *   Copyright (C) 2020, Microsoft Corporation.
   4 *
   5 *   Author(s): Steve French <stfrench@microsoft.com>
   6 *              Suresh Jayaraman <sjayaraman@suse.de>
   7 *              Jeff Layton <jlayton@kernel.org>
   8 */
   9
  10#include <linux/fs.h>
  11#include <linux/slab.h>
  12#include <linux/inet.h>
  13#include <linux/ctype.h>
  14#include "cifsglob.h"
  15#include "cifsproto.h"
  16
  17/* extract the host portion of the UNC string */
  18char *extract_hostname(const char *unc)
  19{
  20        const char *src;
  21        char *dst, *delim;
  22        unsigned int len;
  23
  24        /* skip double chars at beginning of string */
  25        /* BB: check validity of these bytes? */
  26        if (strlen(unc) < 3)
  27                return ERR_PTR(-EINVAL);
  28        for (src = unc; *src && *src == '\\'; src++)
  29                ;
  30        if (!*src)
  31                return ERR_PTR(-EINVAL);
  32
  33        /* delimiter between hostname and sharename is always '\\' now */
  34        delim = strchr(src, '\\');
  35        if (!delim)
  36                return ERR_PTR(-EINVAL);
  37
  38        len = delim - src;
  39        dst = kmalloc((len + 1), GFP_KERNEL);
  40        if (dst == NULL)
  41                return ERR_PTR(-ENOMEM);
  42
  43        memcpy(dst, src, len);
  44        dst[len] = '\0';
  45
  46        return dst;
  47}
  48
  49char *extract_sharename(const char *unc)
  50{
  51        const char *src;
  52        char *delim, *dst;
  53
  54        /* skip double chars at the beginning */
  55        src = unc + 2;
  56
  57        /* share name is always preceded by '\\' now */
  58        delim = strchr(src, '\\');
  59        if (!delim)
  60                return ERR_PTR(-EINVAL);
  61        delim++;
  62
  63        /* caller has to free the memory */
  64        dst = kstrdup(delim, GFP_KERNEL);
  65        if (!dst)
  66                return ERR_PTR(-ENOMEM);
  67
  68        return dst;
  69}
  70