Commit Graph

97 Commits

Author SHA1 Message Date
Leah Rowe f90af15502 safer macro
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 06:10:57 +01:00
Leah Rowe e731893208 util/nvmutil: call usage if argc below 3
otherwise, we invoke the state machine in weird
conditions, where some pointers may not be initialised.

we could handle this properly, but why?

therefore, the errhook is called after the argc
check.

this patch fixes a Speicherzugriffsfehler that
i got while running nvmutil with below 3 arguments

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 17:54:48 +01:00
Leah Rowe d2abde5303 libreboot-utils: stricter errno handling
where possible, try not to clobber sys errno. override
it only when relatively safe.

also: when a syscall succeeds, it may set errno. this
is rare, but permitted (nothing specified against it
in specs, and the specs say that errno is undefined
on success).

i'm not libc, but i'm wrapping around it, so i need
to be careful in how i handle the errno value.

also:

i removed the requirement for directories to be
executable, in mkhtemp.c, because this isn't required
and will only break certain setups.

in world_writeable and sticky, i made the checks stricter:
the faccessat check was being skipped on some paths, so
i've closed that loophole now.

i also generally cleaned up some code, as part of the errno
handling refactoring, where it made sense to do so, plus a
few other bits of code cleanup.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 17:49:23 +01:00
Leah Rowe c0fd88155a lbutils/rand: add missing error handle
accidentally removed in previous refactor

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 14:14:44 +01:00
Leah Rowe 6d9f162f5b lbutils/file: only support real pread/pwrite
the portable version was written for fun, but
it's bloat, and makes the code hard to read.

every unix since about 2005 has these functions.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 12:22:42 +01:00
Leah Rowe a769537554 lbutils/file: don't alllow EAGAIN/EWOULDBLOCK
a non-blocking file descriptor could be used while
errno is set to these. this would create an infinite
loop. it's better that we only allow EINTR.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 12:06:33 +01:00
Leah Rowe bca09eebf3 lbutils/file: remove ETXTBSY from exemption on io
obsolete. ripe for abuse. do not permit this error.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 12:04:37 +01:00
Leah Rowe 277c0c8e87 lbutils/file: don't reset errno on successful io
some io syscalls may set errno on success. this patch
honours that. we try to preserve caller errno, but it
is important for debugging not to clobber it.

if fs_err_retry errs, then we don't reset errno.
if fs_err is successful but errno wasn't set, we
restore caller errno. this is done by setting errno
to zero in callers, which also restore caller errno.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 12:03:46 +01:00
Leah Rowe aacf9fb6c9 libreboot-utils: unified EINTR loop handling
absolutely unified.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 11:45:21 +01:00
Leah Rowe f2dd830c7b TODO
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 07:47:15 +01:00
Leah Rowe 2f7623ff06 libreboot-utils: unified max path lengths
just use PATH_MAX like a normal person

with additional safety

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-31 07:42:40 +01:00
Leah Rowe fb5f1b4ed1 correct exit status
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-30 07:12:25 +01:00
Leah Rowe 9400f4ea0b be reasonable
8GB of entropy is a tad extreme

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-30 07:04:26 +01:00
Leah Rowe da20b75bea libreboot-utils: more flexible string usage
i previously used error status and set return values
indirectly. i still do that, but where possible, i
also now return the real value.

this is because these string functions can no longer
return with error status; on error, they all abort.
this forces the program maintainer to keep their code
reliable, and removes the need to check the error status
after using syscalls, because these libc wrappers mitigate
that and make use of libc for you, including errors.

this is part of a general effort to promote safe use
of the C programming language, especially in libreboot!

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-30 06:25:52 +01:00
Leah Rowe b96708bd3a lbutils: strict string functions - abort on err
on the conditions where these functions encounter
an unexpected error, we currently return -1

this means that the caller must check. which means
the caller won't check. nobody does. i often forget.

force the caller (me) to be correct, instead.

the current calling convention is that the real
return value is stored in a pointer, provided inside
the function signature, on a given string function,
and the function's return value is merely an indicator.

this calling convention is retained for now; the next
patch will change it, such that the real value is also
the function's return value. this is more flexible.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-30 03:03:14 +01:00
Leah Rowe 9d4302deb2 libreboot-utils: optimised string functions
operate per word, not per byte

this is also done on sdup, which uses a slightly
inefficient method: the new string allocation is
that of the maximum size, rather than what we
need. for example, if you wanted a 20 character
string (21 including null), you would still allocate
4096 bytes if that was the maximum length.

it's a bit naughty, and i have half a mind to
keep sdup on the old implementation, but i'll leave
it be for now.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-30 01:53:17 +01:00
Leah Rowe 7fb0b2f692 libreboot-utils: safe memcmp
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 23:55:38 +01:00
Leah Rowe 01aa95ec15 Revert "lbmk: use mkhtemp in libreboot's build system"
This reverts commit e54862fccc.

nope. not ready yet. will fix it later.
2026-03-29 16:25:41 +01:00
Leah Rowe e54862fccc lbmk: use mkhtemp in libreboot's build system
i added a fake -t option, which doesn't actually
read optarg, so that -t usage can just override
the normal template. mkhtemp isn't ready for
distros yet, but it's ready for lbmk.

i hacked the makefile to also copy the binary to
mktemp, and i set PATH in lbmk so that this binary
is used insttead of the one on your system.

that way, upstream projects use it.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 16:08:00 +01:00
Leah Rowe 8657d084d2 util/nvmutil: re-add cleanup
delete tmpfiles after operation. fixes a bug where
tmpfiles are left behind after running the dump
command.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 14:37:51 +01:00
Leah Rowe e4016eb32c lbutils hexdump: reduce width on smaller integers
showing the size for 64-bit high integers seems silly

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 14:26:56 +01:00
Leah Rowe ac04a5f50a libreboot-utils/lib: loop eintr on [p]read/[p]write
i forgot to do this!

with this, I/O should be bullet proof now.
i already loop this on other I/O commands.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 14:15:34 +01:00
Leah Rowe a56903a7b0 mkhtemp: rename variable for clarity
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 13:53:55 +01:00
Leah Rowe b70ee41c5c hexdump performance test, part 1
spoiler alert: it's slow as molasses

part 2 will be presented at a later date

(yes, please don't fill 8GB of memory with
random data and hexdump it)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 13:42:37 +01:00
Leah Rowe cec3de5c9e mkhtemp: generalised string concatenation
scatn in strings.c was buggy, so i replaced it; it
concatenates any number of things.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 10:35:33 +01:00
Leah Rowe 1539aff302 lbutils: simplify getprogname usage
the functions no longer return errors, so i don't
need to handle them.

furthermore, the handling in state.c is redundant,
so i've removed that too.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 09:30:10 +01:00
Leah Rowe c2a70b7de0 libreboot-utils: simplify random tmpdir namegen
generalise it in rand.c because this logic will
be useful for other programs in the future.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 09:18:36 +01:00
Leah Rowe 45edcf33f7 lbutils: rename mkrbuf to rmalloc
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 08:37:32 +01:00
Leah Rowe 6e4839d356 libreboot-utils: simplify lbgetprogname
make it more reliable; it can't segfault
now, under any circumstance. not even
once.

the problem arised when lbsetname was not
called in a program, before calling the
function: lbgetprogname. a segfault would
occur, due to it being NULL.

not every os/libc has getprogname, so i have
my own implementation.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 08:20:09 +01:00
Leah Rowe 909b321f3a lbutils makefile: use c99 in strict mode
not c90

i use stdint now on a few files. i had this
idea in my head to use C89 for some reason,
but this is pointless.

c99 however is worthy as a minimum, because
for example, compilers like tcc will adhere
to its spec (for the most part), so this is
the minimum reasonable requirement on modern
unix systems.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 07:30:29 +01:00
Leah Rowe afe2e71c01 util/nvmutil: better hexdump
this is a more generic one that i implemented
for "lottery.c" (which is really just a tester
of my rset function in lib/rand.c)

i could probably actually write a full hexdump
program in libreboot-utils to be honest.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 07:22:34 +01:00
Leah Rowe 546565f321 cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-29 07:09:06 +01:00
Leah Rowe ab79f2b113 TODO
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:27:55 +00:00
Leah Rowe 5b26343e24 TODO
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:17:44 +00:00
Leah Rowe 16bc9feda8 mkhtemp: use O_NOFOLLOW in same_dir
we have a policy:
symlinks do not exist.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:16:05 +00:00
Leah Rowe 93ecd26306 TODO
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:12:15 +00:00
Leah Rowe c4ff9e5763 lbutils env_tmpdir: use static strings for fallback
i currently return pointers to these, without copying.

they can fade because of this. make them static, since that
is what they should be anyway.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:07:40 +00:00
Leah Rowe 6643d9c1fa lbutils: unify xopen and open_on_eintr
use open_on_eintr for gbe files

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 09:03:18 +00:00
Leah Rowe 4ecdadb7a6 libreboot-utils: unified errno handling on returns
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 08:32:27 +00:00
Leah Rowe 49cac232d8 libreboot-utils: much stricter open() handling
abort on error, and do EINTR looping

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 08:09:14 +00:00
Leah Rowe 03dd3c2894 lbutils/file ffree_and_set_null: err if null
free can take a null, that's fine, but my pointer
to the pointer being freed should not be null. that
is a bug.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 07:47:31 +00:00
Leah Rowe 63984a4a6a libreboot-utils: much stricter close() handling
remove close_warn and close_no_err

make close_on_eintr a void, and abort
on error instead of returning -1.

a failed file closure is a world-ending
event. burn accordingly.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 07:30:55 +00:00
Leah Rowe fd26c6e631 util/mkhtemp: fix wrongful errno reset
on error state, i was resetting errno
unconditionally, which would then mask
the real error.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 07:06:22 +00:00
Leah Rowe 0f1a22174f libreboot-utils: unified error handling
i now use a singleton hook function per program:
nvmutil, mkhtemp and lottery

call this at the startup of your program:

(void) errhook(exit_cleanup);

then provide that function. make it static,
so that each program has its own version.

if you're writing a program that handles lots
of files for example, and you want to do certain
cleanup on exit (including error exit), this can
be quite useful.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 06:53:37 +00:00
Leah Rowe 55f0e6ac8e libreboot-utils: simplified pledge/unveil usage
i no longer care about openbsd 5.9. we assume unveil
is available, as has been the case for the past 12
years.

i use wrappers for unveil and pledge, which means that
i call them on every os. on OSes that don't have these,
i just return. it's somewhat inelegant, but also means
that i see errors more easily, e.g. misnamed variables
inside previous ifdef OpenBSD blocks.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 05:49:41 +00:00
Leah Rowe 7f39ce5f9b libreboot-utils: extremely safe(ish) malloc usage
yes, a common thing in C programs is one or all
of the following:

* use after frees
* double free (on non-NULL pointer)
* over-writing currently used pointer (mem leak)

i try to reduce the chance of this in my software,
by running free() through a filter function,
free_if_not_null, that returns if a function
is being freed twice - because it sets NULL
after freeing, but will only free if it's not
null already.

this patch adds two functions: smalloc and vmalloc,
for strings and voids. using these makes the program
abort if:

* non-null pointer given for initialisation
* pointer to pointer is null (of course)
* size of zero given, for malloc (zero bytes)

i myself was caught out by this change, prompting
me to make the following fix in fs_dirname_basename()
inside lib/file.c:

-       char *buf;
+       char *buf = NULL;

Yes.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 04:25:14 +00:00
Leah Rowe cec9a25c2a nvmutil: clamp rand (rejection sampling)
clamp rand to eliminate modulo sampling; high
values on the randomisation will bias the result.

not really critical for mac addresses, but there's
no reason not to have this. this patches reduces
the chance that two libreboot users will generate
the same mac addresses!

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 03:10:46 +00:00
Leah Rowe f4f1670909 util/nvmutil: tidy up hextonum
i had a bunch of hacks in here because i was
previously using very buggy rand. now it's ok.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 03:08:52 +00:00
Leah Rowe 998528c404 rand.c: fix initialisation bug in mrkbuf
should be null on bad return

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-28 02:27:00 +00:00
Leah Rowe 29296fc513 cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-27 22:58:12 +00:00