Commit Graph

3146 Commits

Author SHA1 Message Date
Leah Rowe
65a2f352ee util/nvmutil: obey the 79-character rule
only 79 characters or less, per line.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 14:15:36 +00:00
Leah Rowe
b8091c7bdc util/nvmutil: use spaces when calling err_if
this is separate from other function calls. err_if
is used as though it was an if, where we always add
a space. it's just a quirk of my coding style.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 14:14:06 +00:00
Leah Rowe
23cdfdd00a util/nvmutil: consistent variable/function naming
use the same naming scheme throughout

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 14:12:52 +00:00
Leah Rowe
8812a17683 util/nvmutil: use the invert in goodChecksum
this way, the correct part number is printed when an invalid
part is being operated on, in cmd copy or swap.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 13:38:39 +00:00
Leah Rowe
3bdefad097 util/nvmutil: readGbe: use inverted part in swap
i overlooked this in a previous modification

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 13:23:20 +00:00
Leah Rowe
50942a7a15 util/nvmutil: clean up write_mac_part
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 13:19:22 +00:00
Leah Rowe
d4231e27fa util/nvmutil: clean up cmd_dump
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 13:17:21 +00:00
Leah Rowe
9044b55c48 util/nvmutil: don't copy data in copy/swap
instead, use a single integer, set to 1 if using
these commands (otherwise set to 0) used as an XOR
mask.

use this to invert where data gets read. one quirk
with this is that if a copy operation is performed
from a part with a bad checksum, it's already done
in advance, in memory, but then the check on the
checksum in cmd_copy is now checking the other part,
which will be all zeroes, so i invert that too; this
means now when running cmd_copy, it'll complain about
an invalid part, but the part number is inverted.

it's a small price to pay, because this restores the
previous performance optimisations but without being
as unsafe.

this is also true when doing the swap.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 13:07:39 +00:00
Leah Rowe
98bc523274 util/nvmutil: re-introduce do_read in readGbe
lots of block devices use 4KB block size. it makes
sense to have this optimisation here.

i previously removed it, along with the one that
only reads the NVM area - that one is still gone,
because it was largely pointless.

because of this modification returning, i also
re-introduced the check in setWord against
nvmPartModified - otherwise, for example, running
cmd brick 0 would brick part 0 but then write
all zeroes to part 1.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 12:40:50 +00:00
Leah Rowe
6770fa8ef2 util/nvmutil: use read, not pread, on /dev/urandom
we always read from offset zero, so use read

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 12:31:53 +00:00
Leah Rowe
188a3d012b util/nvmutil: clean up checkdir
those lines at the end are a hangover from the old opendir-
based implementation.

i also made the output more verbose in that first error
check.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 04:17:25 +00:00
Leah Rowe
c64324467f util/nvmutil: use separate st variable for urandom
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 04:13:21 +00:00
Leah Rowe
1c10eb524f util/nvmutil: cleaner directory checking
opendir allocates resources and causes a bunch of other
error conditions which we need to catch.

use of stat is more efficient here.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 04:11:29 +00:00
Leah Rowe
b8e0513123 util/nvmutil: initialise fname to empty string
otherwise, early calls to err_if make use of a NULL string
inside err()

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:57:39 +00:00
Leah Rowe
de5087bbd5 util/nvmutil: fix code formatting on xopen
it still had some leftovers from the old macro-style
implementation. it still compiled, but this patch
fixes the function properly.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:55:12 +00:00
Leah Rowe
efe2635c12 nvmutil: fix the swap function
irrelevant for most users, who are on little endian
anyway, but i broke the swap function on big endian
systems. this fixes it.

the new function uses an intermediate variable instead
of xor swapping, but i accidentally left some relics of
of the old xor swaps in place. this fixes that.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:50:22 +00:00
Leah Rowe
c721d6f4f4 util/nvmutil: use EXIT_FAILURE/SUCCESS for exits
this, in conjunction with the centralised exit scheme now
used by nvmutil, means that we have portable exit status.

notwithstanding the use of non-portable unix functions, and
especially the use of non-standard err.c (which GNU and BSD
libc implementations all have anyway, as does musl).

this code should now run on essentially any computer with
Linux or BSD on it.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:43:06 +00:00
Leah Rowe
e4b8bb4875 util/nvmutil: make err_if a function, not a macro
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:38:45 +00:00
Leah Rowe
c98d5c743f util/nvmutil: properly cast void use of set_err
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:35:37 +00:00
Leah Rowe
7213bba0c5 util/nvmutil: don't exit with errno as status
exit with 0 or 1, as is proper.

errno is an int, but the return value on a shell
can be e.g. byte, and depending how that number (errno)
is valued, could overflow and cause a zero exit, where
you want a non-zero exit.

the code has been changed, in such a way to maintain
current behaviour (don't change errno), except that when
errno is set upon exit, the exit value is now one.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 03:31:09 +00:00
Leah Rowe
490f311d05 util/nvmutil: split up cmd_setmac
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 02:50:03 +00:00
Leah Rowe
3cbaa7ead8 util/nvmutil: rename some functions for clarity
also re-order the prototypes

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 02:32:42 +00:00
Leah Rowe
707fabab38 util/nvmutil: split up parseMacString
split it into smaller, more readable functions

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 02:25:11 +00:00
Leah Rowe
d9c307d5a3 util/nvmutil: remove useless gbe variable
use buf directly

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 01:50:21 +00:00
Leah Rowe
a7cc8143a7 util/nvmutil: cmd copy/swap: use word/setWord
this means that we make use of the boundary checks. it's just
a safer way of handling these functions.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 01:18:23 +00:00
Leah Rowe
566ae72ca3 util/nvmutil: remove variable nvmPartChanged
pointless optimisation. we know that when a user requests an
operation that would write, it will probably result in a change.

therefore, this change is the real optimisation. to avoid
writing the same half of a file twice, when using cmd_copy,
we check (in writeGbe) whether gbe part 0 and 1 are the same;
if they are, then we only loop once. this is important, because
otherwise we would call swap() twice.

this means that the optimisations in cmd_copy and cmd_swap must
be removed. the point of this and other changes is to improve
memory safety in nvmutil, so frivolous use of pointers has to go.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 01:07:59 +00:00
Leah Rowe
dfbb3c5d9e util/nvmutil: merge nvmalloc with readGbe
it's so simply now, all it does is set the gbe pointers

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 00:41:05 +00:00
Leah Rowe
2b01e023ab util/nvmutil: remove do_read
pointless code complication, that doesn't yield a noticeable
performance increase.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 00:40:07 +00:00
Leah Rowe
1bfc89e3ad util/nvmutil: read in fixed 4KB blocks
modern file systems work in 4KB blocks. reading only
a small part of it doesn't really make much difference
in terms of performance.

simplify the code instead.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 00:34:31 +00:00
Leah Rowe
1d078c9daf util/nvmutil: use fixed buffer
modern malloc implementations make the optimisation here
pretty pointless.

modern computers make this modification pointless.

i'm not planning to run nvmutil on a VAX. openbsd removed
support for it ages ago. 8KB fixed buffer is fine.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 00:20:16 +00:00
Leah Rowe
0ccb790fc0 util/nvmutil: remove pointless arg in openFiles
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-03 00:11:49 +00:00
Leah Rowe
6dd91134bd util/nvmutil: don't use xor swap
it doesn't save any time on modern systems, and it's just
confusing for some people to read. i mean, i understand it
instinctively, but normal people do it with a swap variable.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 23:29:00 +00:00
Leah Rowe
53e386d2b5 util/nvmutil: don't use size_t as pointer
the only reason i did this was for that xor swap, but we
can just use an intermediary value

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 23:26:02 +00:00
Leah Rowe
3248b8f651 util/nvmutil: don't capitalise set_err
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 23:04:03 +00:00
Leah Rowe
d3ca9946a9 util/nvmutil: make xopen a function, not a macro
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 23:02:53 +00:00
Leah Rowe
761968e3c4 util/nvmutil: merge block_unveil back with main
we always want unveil/pledge calls to be in main, when
possible, so that they are more transparent and easier
to understand when re-factoring, because it's extremely
important that these syscalls be done correctly.

main is small enough now, from other re-factoring changes,
that i'm happy to have this back in main now.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 22:30:19 +00:00
Leah Rowe
589ac92781 util/nvmutil: fix bad bound check
the current check is too liberal. make it sticter.

the issue is that the previous check did not take
into account that it's a check on a uint16_t array,
against nf which refers to a number of bytes.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:47:58 +00:00
Leah Rowe
51e4e43c94 util/nvmutil: tidy up the xopen macro
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:41:10 +00:00
Leah Rowe
a34e79f501 util/nvmutil: add boundary checks on word/setWord
this was the other complication with doing it as a macro.

for something this fundamental, we really want to ensure
that every access is safe.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:35:00 +00:00
Leah Rowe
4e7d48b5c5 util/nvmutil: make word/setWord a function
having this as a macro makes the code quite brittle.

better to have it as a function.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:34:37 +00:00
Leah Rowe
8707695184 util/nvmutil: rename openGbeFile to openFiles
merge the urandom handling back into this function.

it's called immediately after in main anyway, so we
may as well. this reduces the size of main.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:06:57 +00:00
Leah Rowe
c4138752c3 util/nvmutil: remove redundant unveil call
in the given call, we then do an equivalent call
immediately after that is the same, but without
unveil, so we'll just defer to that.

this changes no behaviour.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:03:00 +00:00
Leah Rowe
a4fe1bfa4d util/nvmutil: call block_unveil earlier
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 17:01:41 +00:00
Leah Rowe
ea1a9bc786 util/nvmutil: bring pledge in set_io_flag to main
in general, we should ensure that the pledge calls only happen
inside main. this means we can more easily see them, in future
re-factoring.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:57:50 +00:00
Leah Rowe
46b6b1feb3 util/nvmutil: call set_cmd much earlier
this will enable hardening of the pledge syscalls.

it also means that the program will error out much
earlier, when an invalid command is given, rather
than opening a bunch of files first, and it will
do so under reduced privilege already, notwithstanding
the further pledge/unveil hardening that is planned.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:46:20 +00:00
Leah Rowe
0106c38217 util/nvmutil: unveil /dev/urandom much earlier
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:41:06 +00:00
Leah Rowe
58cf5a1579 util/nvmutil: split xopen handling
same as the previous change. i'm going to harden the unveil
and pledge calls next.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:38:09 +00:00
Leah Rowe
e5d7c3e3a2 util/nvmutil: split unveil handling
urandom in main. this is because i'm going to further
harden the use of pledge and unveil in a future patch,
and this is a prerequisite.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:34:59 +00:00
Leah Rowe
896f0ea1df util/nvmutil: split cmd init to new function
Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 16:34:18 +00:00
Leah Rowe
697eda800a util/nvmutil: split flags init to new function
main is getting much smaller now

Signed-off-by: Leah Rowe <leah@libreboot.org>
2026-03-02 12:55:57 +00:00