1*b13c0e40SEric Biggers // SPDX-License-Identifier: MIT
2*b13c0e40SEric Biggers /*
3*b13c0e40SEric Biggers * Utility functions for libfsverity
4*b13c0e40SEric Biggers *
5*b13c0e40SEric Biggers * Copyright 2020 Google LLC
6*b13c0e40SEric Biggers *
7*b13c0e40SEric Biggers * Use of this source code is governed by an MIT-style
8*b13c0e40SEric Biggers * license that can be found in the LICENSE file or at
9*b13c0e40SEric Biggers * https://opensource.org/licenses/MIT.
10*b13c0e40SEric Biggers */
11*b13c0e40SEric Biggers
12*b13c0e40SEric Biggers #include "lib_private.h"
13*b13c0e40SEric Biggers
14*b13c0e40SEric Biggers #include <stdio.h>
15*b13c0e40SEric Biggers #include <stdlib.h>
16*b13c0e40SEric Biggers #include <string.h>
17*b13c0e40SEric Biggers
xmalloc(size_t size)18*b13c0e40SEric Biggers static void *xmalloc(size_t size)
19*b13c0e40SEric Biggers {
20*b13c0e40SEric Biggers void *p = malloc(size);
21*b13c0e40SEric Biggers
22*b13c0e40SEric Biggers if (!p)
23*b13c0e40SEric Biggers libfsverity_error_msg("out of memory (tried to allocate %zu bytes)",
24*b13c0e40SEric Biggers size);
25*b13c0e40SEric Biggers return p;
26*b13c0e40SEric Biggers }
27*b13c0e40SEric Biggers
libfsverity_zalloc(size_t size)28*b13c0e40SEric Biggers void *libfsverity_zalloc(size_t size)
29*b13c0e40SEric Biggers {
30*b13c0e40SEric Biggers void *p = xmalloc(size);
31*b13c0e40SEric Biggers
32*b13c0e40SEric Biggers if (!p)
33*b13c0e40SEric Biggers return NULL;
34*b13c0e40SEric Biggers return memset(p, 0, size);
35*b13c0e40SEric Biggers }
36*b13c0e40SEric Biggers
libfsverity_memdup(const void * mem,size_t size)37*b13c0e40SEric Biggers void *libfsverity_memdup(const void *mem, size_t size)
38*b13c0e40SEric Biggers {
39*b13c0e40SEric Biggers void *p = xmalloc(size);
40*b13c0e40SEric Biggers
41*b13c0e40SEric Biggers if (!p)
42*b13c0e40SEric Biggers return NULL;
43*b13c0e40SEric Biggers return memcpy(p, mem, size);
44*b13c0e40SEric Biggers }
45*b13c0e40SEric Biggers
46*b13c0e40SEric Biggers static void (*libfsverity_error_cb)(const char *msg);
47*b13c0e40SEric Biggers
48*b13c0e40SEric Biggers LIBEXPORT void
libfsverity_set_error_callback(void (* cb)(const char * msg))49*b13c0e40SEric Biggers libfsverity_set_error_callback(void (*cb)(const char *msg))
50*b13c0e40SEric Biggers {
51*b13c0e40SEric Biggers libfsverity_error_cb = cb;
52*b13c0e40SEric Biggers }
53*b13c0e40SEric Biggers
libfsverity_do_error_msg(const char * format,va_list va)54*b13c0e40SEric Biggers void libfsverity_do_error_msg(const char *format, va_list va)
55*b13c0e40SEric Biggers {
56*b13c0e40SEric Biggers int saved_errno = errno;
57*b13c0e40SEric Biggers char *msg = NULL;
58*b13c0e40SEric Biggers
59*b13c0e40SEric Biggers if (!libfsverity_error_cb)
60*b13c0e40SEric Biggers return;
61*b13c0e40SEric Biggers
62*b13c0e40SEric Biggers if (vasprintf(&msg, format, va) < 0)
63*b13c0e40SEric Biggers goto out;
64*b13c0e40SEric Biggers
65*b13c0e40SEric Biggers (*libfsverity_error_cb)(msg);
66*b13c0e40SEric Biggers
67*b13c0e40SEric Biggers free(msg);
68*b13c0e40SEric Biggers out:
69*b13c0e40SEric Biggers errno = saved_errno;
70*b13c0e40SEric Biggers }
71*b13c0e40SEric Biggers
libfsverity_error_msg(const char * format,...)72*b13c0e40SEric Biggers void libfsverity_error_msg(const char *format, ...)
73*b13c0e40SEric Biggers {
74*b13c0e40SEric Biggers va_list va;
75*b13c0e40SEric Biggers
76*b13c0e40SEric Biggers va_start(va, format);
77*b13c0e40SEric Biggers libfsverity_do_error_msg(format, va);
78*b13c0e40SEric Biggers va_end(va);
79*b13c0e40SEric Biggers }
80*b13c0e40SEric Biggers
libfsverity_warn_on(const char * condition,const char * file,int line)81*b13c0e40SEric Biggers void libfsverity_warn_on(const char *condition, const char *file, int line)
82*b13c0e40SEric Biggers {
83*b13c0e40SEric Biggers fprintf(stderr, "libfsverity internal error! %s at %s:%d\n",
84*b13c0e40SEric Biggers condition, file, line);
85*b13c0e40SEric Biggers }
86*b13c0e40SEric Biggers
libfsverity_bug_on(const char * condition,const char * file,int line)87*b13c0e40SEric Biggers void libfsverity_bug_on(const char *condition, const char *file, int line)
88*b13c0e40SEric Biggers {
89*b13c0e40SEric Biggers fprintf(stderr, "libfsverity internal error! %s at %s:%d\n"
90*b13c0e40SEric Biggers "Non-recoverable, aborting program.\n", condition, file, line);
91*b13c0e40SEric Biggers abort();
92*b13c0e40SEric Biggers }
93*b13c0e40SEric Biggers
libfsverity_mem_is_zeroed(const void * mem,size_t size)94*b13c0e40SEric Biggers bool libfsverity_mem_is_zeroed(const void *mem, size_t size)
95*b13c0e40SEric Biggers {
96*b13c0e40SEric Biggers const u8 *p = mem;
97*b13c0e40SEric Biggers size_t i;
98*b13c0e40SEric Biggers
99*b13c0e40SEric Biggers for (i = 0; i < size; i++) {
100*b13c0e40SEric Biggers if (p[i])
101*b13c0e40SEric Biggers return false;
102*b13c0e40SEric Biggers }
103*b13c0e40SEric Biggers return true;
104*b13c0e40SEric Biggers }
105