Commit Graph

51 Commits

Author SHA1 Message Date
Leah Rowe 736a2504bb lbutils/file: don't loop EINTR on close()
state is undefined after EINTR. just abort universally.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 17:43:43 +01:00
Leah Rowe 3d24aa98f9 lbutils: remove more unused macros
detected via clang -Weverything

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 16:50:50 +01:00
Leah Rowe 9dc141bafa lbutils/rand: close fd on urandom error
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 14:35:24 +01:00
Leah Rowe a879114734 lbutils: remove rw on_eintr functions. just use rw
rw is enough. i unified everything there.

next commit will remove rw_type and instead
run positional i/o depending on whether the
offset is zero. i'm simplifying the API a lot.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 14:29:39 +01:00
Leah Rowe 4e72555ac7 lbutils: support using arc4random on linux
-DUSE_ARC4=1

use that

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 12:44:38 +01:00
Leah Rowe 44004191cb lbutils: don't set USE_OPENAT and USE_URANDOM
these can be set explicitly in the compiler flags,
e.g.

make CC="cc -DUSE_OPENAT=1 -DUSE_URANDOM=1"

these options, if set to 1, will cause you to use
the code as if it were running on non-linux systems
such as openbsd. of course, some differences will
still exist, but this is useful for portability
testing when compiling on linux.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 12:30:55 +01:00
Leah Rowe 2c40ad7816 lbutils: only use GNU SOURCE for syscall
and remove manual prototypes; fchmod, realpath
and so on rely on the _XOPEN_SOURCE macro.

the POSIX macro wasn't needed: _XOPEN_SOURCE
is sufficient.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 11:52:53 +01:00
Leah Rowe 716140b80f libreboot-utils: don't use the GNU SOURCE macro
use the POSIX one

declare prototypes where necessary.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 11:00:58 +01:00
Leah Rowe 861f56375a libreboot-utils: fix ALL compiler warnings
i wasn't using strict mode enough in make:

make strict

now it compiles cleanly. mostly removing
unused variables, fixing implicit conversions,
etc.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 10:03:41 +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 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 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 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 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 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 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 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 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 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 0cc4ff7b3b util/libreboot-utils: fix div by zero in rsize
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-27 17:14:10 +00:00
Leah Rowe d1ba9bae03 further cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 13:09:43 +00:00
Leah Rowe 10ecf32e33 libreboot-utils: improved randomness test
and the module bias handling is fully correct

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 10:52:11 +00:00
Leah Rowe 8e8f7bced4 mkhtemp rand: fix theoretical integer overflow
extremely theoretical, with a T. T for theoretical.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 09:04:30 +00:00
Leah Rowe d6087901c1 rand/libreboot/utils: prevent div by zero
not really a thing. bufsiz would never be zero,
unless the demon takes over linux

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 08:59:03 +00:00
Leah Rowe cf16d07df9 rand: fix modulo bias in rmalloc
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 08:56:15 +00:00
Leah Rowe 8522b5c391 more cleanup on rand.c
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe e151179d14 cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe f4f3fe3e0a libreboot-utils: tidy up rand.c
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe b84c929e64 rmalloc
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe e0319f0116 util/libreboot-utils: randomisation test
to test the effectiveness of the rand function

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe dc7a02da2d cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe c66f381e90 mkrstr
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 1e79219bea lbutils: new function, mkrbuf (random malloc)
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe ee4f765719 lbutils: close fd on rset failure
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe e8c4bccd86 further clarify intentt
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 4034b211ce lbutils, rset: err if zero bytes requested
similar to the logic about other failure states

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe b26837c4dc dot
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe e44ea5d794 lbutils: also check null!
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 7b3c8cf7ec lbutils: clarify design regarding urandom/getrandom
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 34f26319d7 lbutils, rand: err on zero return (fatal)
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe bce1099509 cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 0626bf48f4 lbutils: cast to prevent ub in rset()
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 50e3b1f45d cleanup
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 0d86fd38df fix offset on urandom falback
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe a70ede850d libreboot-utils: replace rlong() with rset()
now you can send an arbitrary number of bytes
with random numbers

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 00b56c0278 libreboot-utils: tidy up rand
also re-add /dev/urandom support, as a config option

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00
Leah Rowe 6c8cf9a9e0 util/mkhtemp: use /dev/urandom *if enabled*
build-time option. do not allow fallback; on
a system where getrandom is used, it should
be used exclusively.

on some systems, getrandom may not be available,
even if they have a newer kernel.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-26 06:59:42 +00:00