blob: d506ef1c01aee85b5deca897ad78c0983a98f81c [file] [log] [blame]
// 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;
}