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