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>
This commit is contained in:
Leah Rowe
2026-03-29 08:09:52 +01:00
parent 909b321f3a
commit 6e4839d356
2 changed files with 17 additions and 27 deletions
+2 -2
View File
@@ -31,7 +31,7 @@ of something like e.g. unveil, but in userspace!
Mkhtemp is designed to be the most secure implementation
possible, of mktemp, offering a heavy amount of hardening
over traditional mktemp. Written in C89, and the plan is
over traditional mktemp. Written in C99, and the plan is
very much to keep this code portable over time - patches
very much welcome.
@@ -241,7 +241,7 @@ a drop-in replacement on Linux distros (and BSDs if they
want it), while providing a more hardened version and
recommending that where possible.
~~Rewrite it in rust~~ (nothing against it though, I just like C89 for some reason)
~~Rewrite it in rust~~ (nothing against it though, I just like C99 for some reason)
Also, generally document the history of mktemp, and how
mkhtemp works in comparison.
+15 -25
View File
@@ -359,22 +359,16 @@ no_op(void)
const char *
lbgetprogname(void)
{
static char *rval = NULL;
static char *p;
static int setname = 0;
if (!setname) {
if ((rval = lbsetprogname(NULL)) == NULL)
return NULL;
p = strrchr(rval, '/');
if (p)
rval = p + 1;
setname = 1;
}
return rval;
char *name = lbsetprogname(NULL);
char *p = NULL;
if (name)
p = strrchr(name, '/');
if (p)
return p + 1;
else if (name)
return name;
else
return "libreboot-utils";
}
/* singleton. if string not null,
@@ -385,17 +379,13 @@ lbgetprogname(void)
char *
lbsetprogname(char *argv0)
{
static int setname = 0;
static char *progname = NULL;
size_t len;
static int set = 0;
if (!setname) {
if (if_err(argv0 == NULL || *argv0 == '\0', EFAULT) ||
slen(argv0, 4096, &len) < 0)
return NULL;
memcpy(smalloc(&progname, len + 1), argv0, len + 1);
setname = 1;
if (!set) {
if (argv0 == NULL || sdup(argv0, 4096, &progname) < 0)
return "libreboot-utils";
set = 1;
}
return progname;