aboutsummaryrefslogtreecommitdiff
path: root/lib/utils.c
blob: d506ef1c01aee85b5deca897ad78c0983a98f81c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// SPDX-License-Identifier: MIT
/*
 * Utility functions for libfsverity
 *
 * Copyright 2020 Google LLC
 *
 * Use of this source code is governed by an MIT-style
 * license that can be found in the LICENSE file or at
 * https://opensource.org/licenses/MIT.
 */

#include "lib_private.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void *xmalloc(size_t size)
{
	void *p = malloc(size);

	if (!p)
		libfsverity_error_msg("out of memory (tried to allocate %zu bytes)",
				      size);
	return p;
}

void *libfsverity_zalloc(size_t size)
{
	void *p = xmalloc(size);

	if (!p)
		return NULL;
	return memset(p, 0, size);
}

void *libfsverity_memdup(const void *mem, size_t size)
{
	void *p = xmalloc(size);

	if (!p)
		return NULL;
	return memcpy(p, mem, size);
}

static void (*libfsverity_error_cb)(const char *msg);

LIBEXPORT void
libfsverity_set_error_callback(void (*cb)(const char *msg))
{
	libfsverity_error_cb = cb;
}

void libfsverity_do_error_msg(const char *format, va_list va)
{
	int saved_errno = errno;
	char *msg = NULL;

	if (!libfsverity_error_cb)
		return;

	if (vasprintf(&msg, format, va) < 0)
		goto out;

	(*libfsverity_error_cb)(msg);

	free(msg);
out:
	errno = saved_errno;
}

void libfsverity_error_msg(const char *format, ...)
{
	va_list va;

	va_start(va, format);
	libfsverity_do_error_msg(format, va);
	va_end(va);
}

void libfsverity_warn_on(const char *condition, const char *file, int line)
{
	fprintf(stderr, "libfsverity internal error! %s at %s:%d\n",
		condition, file, line);
}

void libfsverity_bug_on(const char *condition, const char *file, int line)
{
	fprintf(stderr, "libfsverity internal error! %s at %s:%d\n"
		"Non-recoverable, aborting program.\n", condition, file, line);
	abort();
}

bool libfsverity_mem_is_zeroed(const void *mem, size_t size)
{
	const u8 *p = mem;
	size_t i;

	for (i = 0; i < size; i++) {
		if (p[i])
			return false;
	}
	return true;
}