summaryrefslogtreecommitdiff
path: root/kernel/libc/string/copy.c
blob: 277c80834385bb3e63f645af0ebaf0dba56aff99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <assert.h>
#include <kmalloc.h>
#include <stddef.h>
#include <string.h>

char *copy_and_allocate_string(const char *s) {
  size_t l = strlen(s);
  char *r = kmalloc(l + 1);
  if (!r)
    return NULL;
  return strncpy(r, s, l);
}

char *copy_and_allocate_user_string(const char *s) {
  size_t len;
  if (!is_valid_user_c_string(s, &len))
    return NULL;
  size_t real_len = strlen(s);
  assert(real_len == len);
  len = real_len;
  char *r = kmalloc(len + 1);
  if (!r)
    return NULL;
  strlcpy(r, s, len);
  return r;
}