xref: /aosp_15_r20/external/fsverity-utils/lib/utils.c (revision b13c0e4024008a1f948ee8189745cb3371f4ac04)
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