---
name: "copyinstr"
section: "9"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/copy/9"
---

# copyinstr(9)

heterogeneous address space copy functions

Part of [copy(9)](/copy/9.md).

## NAME

**copy**, **copyin**, **copyin\_nofault**, **copyinptr**, **copyinptr\_nofault**, **copyout**, **copyout\_nofault**, **copyoutptr**, **copyoutptr\_nofault**, **copystr**, **copyinstr** – heterogeneous address space copy functions

## SYNOPSIS

**#include \<sys/types.h\>**

**#include \<sys/systm.h\>**

*int*\

**copyin**(*const void \*uaddr*, *void \*kaddr*, *size\_t len*);

*int*\

**copyin\_nofault**(*const void \*uaddr*, *void \*kaddr*, *size\_t len*);

*int*\

**copyinptr**(*const void \*uaddr*, *void \*kaddr*, *size\_t len*);

*int*\

**copyinptr\_nofault**(*const void \*uaddr*, *void \*kaddr*, *size\_t len*);

*int*\

**copyout**(*const void \*kaddr*, *void \*uaddr*, *size\_t len*);

*int*\

**copyout\_nofault**(*const void \*kaddr*, *void \*uaddr*, *size\_t len*);

*int*\

**copyoutptr**(*const void \*kaddr*, *void \*uaddr*, *size\_t len*);

*int*\

**copyoutptr\_nofault**(*const void \*kaddr*, *void \*uaddr*, *size\_t len*);

*int* *\_\_deprecated*\

**copystr**(*const void \*kfaddr*, *void \*kdaddr*, *size\_t len*, *size\_t \*done*);

*int*\

**copyinstr**(*const void \*uaddr*, *void \*kaddr*, *size\_t len*, *size\_t \*done*);

## DESCRIPTION

The **copy** functions are designed to copy contiguous data from one address space to another.

**copystr**() is deprecated and should be replaced with [strlcpy(3)](/strlcpy/3.md), which has a kernel-to-kernel version. It will be removed from FreeBSD 16.

The **copyin**() and **copyin\_nofault**() functions copy *len* bytes of data from the user-space address *uaddr* to the kernel-space address *kaddr* without preserving the provenance of pointers in the copied object (see [memory\_model(7)](/memory_model/7.md) for further information). The **copyinptr**() and **copyinptr\_nofault**() functions do the same, but preserves the provenance of copied pointers to user-space.

The **copyout**() and **copyout\_nofault**() functions copy *len* bytes of data from the kernel-space address *kaddr* to the user-space address *uaddr* without preserving the provenance of pointers in the copied object. The **copyoutptr**() and **copyoutptr\_nofault**() functions do the same, but preserves the provenance of copied pointers to user-space.

The **copyin\_nofault**(), **copyinptr\_nofault**(), **copyout\_nofault**(), and **copyoutptr\_nofault**() functions require that the kernel-space and user-space data be accessible without incurring a page fault. The source and destination addresses must be physically mapped for read and write access, respectively, and neither the source nor destination addresses may be pageable.

The **copyinptr**(), **copyinptr\_nofault**(), **copyoutptr**(), and **copyoutptr\_nofault**() functions must be used when copying data which may contain pointers, but they should only be used when necessary to limit the number of code paths that could leak pointers between address spaces.

The **copystr**() function copies a NUL-terminated string, at most *len* bytes long, from kernel-space address *kfaddr* to kernel-space address *kdaddr*. The number of bytes actually copied, including the terminating NUL, is returned in *\*done* (if *done* is non-NULL).

The **copyinstr**() function copies a NUL-terminated string, at most *len* bytes long, from user-space address *uaddr* to kernel-space address *kaddr*. The number of bytes actually copied, including the terminating NUL, is returned in *\*done* (if *done* is non-NULL).

## RETURN VALUES

The **copy** functions return 0 on success. All but **copystr**() return EFAULT if a bad address is encountered. The **copyin\_nofault**() and **copyout\_nofault**() functions return EFAULT if a page fault occurs. The **copystr**() and **copyinstr**() functions return ENAMETOOLONG if the string is longer than *len* bytes.

## SEE ALSO

[fetch(9)](/fetch/9.md), [store(9)](/store/9.md)
