Commit Graph

4052 Commits

Author SHA1 Message Date
Leah Rowe 63ec707698 lbutils/file: ignore close err if errno is EINTR
but DONT LOOP IT. see comment.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 21:05:08 +01:00
Leah Rowe 2d69d45e26 remove dead code
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 20:36:05 +01:00
Leah Rowe 6b67e12428 lbutils/file: don't eintr loop fcntl
not indicated. the way we use it is basically like
stat, to check that a file exists / is a file.

just err the fuck out

nuance: SETLK is non-blocking (no wait).
we should loop on SETLKW, but we don't use that.
in this codebase, we use SETLK for locking a
tmpfile, but because of race conditions and
wanting to make another file quickly, we just
try again with a newly generated name, with a
certain number of retries, so we justt use SETLK

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 20:17:26 +01:00
Leah Rowe a6d2de4e88 libreboot-utils: don't loop lseek on EINTR
not necessary.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 19:17:32 +01:00
Leah Rowe d12ca7fd8e lbutils/file: don't use undefined USE_OPENAT
clang -Weverything told me to

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 19:09:26 +01:00
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 249ae57c29 lbutils/file: fix implicit conversion on openat2
as dictated by clang -Weverything

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 17:33:01 +01:00
Leah Rowe c48a962eaf lbutils/file: fix overflow check
clang -Weverything:

lib/file.c:165:49: warning: implicit conversion changes signedness: 'ssize_t' (aka 'long') to 'size_t' (aka 'unsigned long') [-Wsign-conversion]
  165 |                 if (if_err(rval >= 0 && (size_t)rval > (nrw - rc), EOVERFLOW))

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 17:29:28 +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 ae5e74554a lbutils/file: remove unused macro
not needed here (detected with clang -Weverything)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 16:49:19 +01:00
Leah Rowe fb81b7b736 lbutils/file: rename rw_file_exact
call it rw_exact, so that it's closer to
the name rw. it matches naming more closely;
the alternative was to call rw rw_file

but read/write can handle more than just files!

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 16:20:12 +01:00
Leah Rowe f68cedf202 libreboot-utils/file: never retry file rw on zero
even with a timer, it's possible that on a buggy system,
we may keep writing even though the outcome is zero. if
a system comes back with zero bytes written, that is a
fatal bug and we should stop.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 16:19:46 +01:00
Leah Rowe 5b465d3af6 lbutils: remove -Werror
the actual warn flags are still there.

leaving Werror in production is ill advised.

i can (and will) still fix build errors as
i see them.

as a result of this, i now also see more info
when i type:

make strict

(this uses clang with -Weverything)

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 15:02:52 +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 229a283604 lbutils: portable options in Makefile
add options for building with urandom+openat and
arc4+openat. useful for emulating a bsd / old linux
environment in modern linux distros, for portability
testing.

these options are not recommended for everyday use.
just use make without any special options, and the
code has build-time OS detection for features like
randomisation/openat2.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 13:03:30 +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 b7b34413e7 libreboot-utils: fix clang hell mode
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 10:23:48 +01:00
Leah Rowe d100ea1d2f libreboot-utils: always use strict cc flags
otherwise, i will end up with a mess like the
one i recently fixed.

we always want to use correct C. the current
spec is set to c99, with -pedantic turned on.

flags now:

-Os -Wall -Wextra -std=c99 -pedantic -Werror

if you do: make hell, you get (uses clang):
-Os -Wall -Wextra -std=c99 -pedantic -Werror -Weverything

i initially loosened up the Makefile rules, so
that the code would be more "portable", but
every compiler worth caring about has these
flags, and turning them on is advisable,
especially pedantic and -std, because you want
to have some guarantee that the compiler is
generating correct code; if the standard is
left ambiguous, you could be introducing subtle
bugs when people compile it, because who knows
what spec the compiler is using?

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 10:11:30 +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 d91dd0ad81 fix coreboot/fam15h build error on arch
In file included from /home/user/lbmk/src/coreboot/fam15h/util/cbfstool/partitioned_file.h:19,
                 from /home/user/lbmk/src/coreboot/fam15h/util/cbfstool/partitioned_file.c:16:
/home/user/lbmk/src/coreboot/fam15h/util/cbfstool/common.h:34:16: error: expected ‘)’ before ‘__attribute__’
   34 | #define unused __attribute__((unused))
      |                ^~~~~~~~~~~~~
In file included from /home/user/lbmk/src/coreboot/fam15h/util/cbfstool/common.h:25:
/home/user/lbmk/src/coreboot/fam15h/src/commonlib/include/commonlib/helpers.h:137:40: error: expected identifier or ‘(’ before ‘)’ token
  137 | #define __unused __attribute__((unused))

^ this removes that error

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 08:25:54 +01:00
Leah Rowe 9cd86eb584 coreboot/default: fix vboot build error on arch
or any newer linux really.

new gcc is much stricter about const chars.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 08:13:56 +01:00
Leah Rowe e9a975b1f7 fix u-boot builds on arch linux
gnu changed a flag for like, no fucking reason

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 07:42:32 +01:00
Leah Rowe df5bb1c894 libreboot-utils: loop fcntl on eintr
but i can't write a generic function for this,
because fcntl is a variadic function, so wrapping
cannot be done cleanly.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-04-01 06:17:25 +01:00
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