1 /* Copyright (C) 2018-2019 Björn Esser <besser82@fedoraproject.org>
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted.
5 *
6 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
7 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
10 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
11 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
12 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
14 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
15 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
16 * SUCH DAMAGE.
17 */
18
19 /* Simple commonly used helper functions. */
20
21 #include "crypt-port.h"
22
23 /* Provide a safe way to copy strings with the guarantee src,
24 including its terminating '\0', will fit d_size bytes.
25 The trailing bytes of d_size will be filled with '\0'.
26 dst and src must not be NULL. Returns strlen (src). */
27 size_t
28 strcpy_or_abort (void *dst, size_t d_size, const void *src)
29 {
30 assert (dst != NULL);
31 assert (src != NULL);
32 size_t s_size = strlen ((const char *)src);
33 assert (d_size >= s_size + 1);
34
35 memcpy (dst, src, s_size);
36 memset (((char *)dst) + s_size, 0, d_size - s_size);
37 return s_size;
38 }