summaryrefslogtreecommitdiff
path: root/util/libreboot-utils/lib/string.c
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-30 05:13:31 +0100
committerLeah Rowe <leah@libreboot.org>2026-03-30 06:25:52 +0100
commitda20b75beac750bf936c9c959f18bf4dce4bdf11 (patch)
tree4a663207cdd150abca2e87c101fa58dd8b58272c /util/libreboot-utils/lib/string.c
parentb96708bd3abc3cca7894b96a22caf6291b0748b0 (diff)
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>
Diffstat (limited to 'util/libreboot-utils/lib/string.c')
-rw-r--r--util/libreboot-utils/lib/string.c55
1 files changed, 26 insertions, 29 deletions
diff --git a/util/libreboot-utils/lib/string.c b/util/libreboot-utils/lib/string.c
index 7f336eb6..c083bd6d 100644
--- a/util/libreboot-utils/lib/string.c
+++ b/util/libreboot-utils/lib/string.c
@@ -179,7 +179,7 @@ err:
return -1;
out:
errno = saved_errno;
- return 0;
+ return *rval;
}
int ccmp(const char *a, const char *b,
@@ -206,7 +206,7 @@ int ccmp(const char *a, const char *b,
}
/* strict word-based strlen */
-int
+size_t
slen(const char *s,
size_t maxlen,
size_t *rval)
@@ -256,15 +256,15 @@ err:
if (rval != NULL)
*rval = 0;
- err_exit(errno, "slen");
- return -1;
+ err_exit(errno, "slen"); /* abort */
+ return 0; /* gcc15 is happy */
out:
errno = saved_errno;
- return 0;
+ return *rval;
}
/* strict word-based strdup */
-int
+char *
sdup(const char *s,
size_t max, char **dest)
{
@@ -329,14 +329,14 @@ err:
(void) set_errno(saved_errno, EFAULT);
err_exit(errno, "sdup");
- return -1;
+ return NULL;
out:
errno = saved_errno;
- return 0;
+ return *dest;
}
/* concatenate N number of strings */
-int
+char *
scatn(ssize_t sc, const char **sv,
size_t max, char **rval)
{
@@ -356,14 +356,12 @@ scatn(ssize_t sc, const char **sv,
if (if_err(sv[i] == NULL, EFAULT))
goto err;
else if (i == 0) {
- if (sdup(sv[0], max, &final) < 0)
- goto err;
+ (void) sdup(sv[0], max, &final);
continue;
}
rtmp = NULL;
- if (scat(final, sv[i], max, &rtmp) < 0)
- goto err;
+ scat(final, sv[i], max, &rtmp);
free_and_set_null(&final);
final = rtmp;
@@ -372,7 +370,7 @@ scatn(ssize_t sc, const char **sv,
errno = saved_errno;
*rval = final;
- return 0;
+ return *rval;
err:
free_and_set_null(&rcur);
free_and_set_null(&rtmp);
@@ -381,11 +379,11 @@ err:
(void) set_errno(saved_errno, EFAULT);
err_exit(errno, "scatn");
- return -1;
+ return NULL;
}
/* strict strcat */
-int
+char *
scat(const char *s1, const char *s2,
size_t n, char **dest)
{
@@ -400,29 +398,31 @@ scat(const char *s1, const char *s2,
slen(s1, n, &size1);
slen(s2, n, &size2);
- if (if_err(size1 > SIZE_MAX - size2 - 1, EOVERFLOW))
+ if (if_err(size1
+ > SIZE_MAX - size2 - 1, EOVERFLOW))
goto err;
- memcpy(smalloc(&rval, size1 + size2 + 1),
- s1, size1);
+ smalloc(&rval, size1 + size2 + 1);
+
+ memcpy(rval, s1, size1);
memcpy(rval + size1, s2, size2);
*(rval + size1 + size2) = '\0';
*dest = rval;
errno = saved_errno;
- return 0;
+ return *dest;
err:
(void) set_errno(saved_errno, EINVAL);
if (dest != NULL)
*dest = NULL;
err_exit(errno, "scat");
- return -1;
+ return NULL;
}
/* strict split/de-cat - off is where
2nd buffer will start from */
-int
+void
dcat(const char *s, size_t n,
size_t off, char **dest1,
char **dest2)
@@ -435,9 +435,7 @@ dcat(const char *s, size_t n,
if (if_err(dest1 == NULL || dest2 == NULL, EFAULT))
goto err;
- slen(s, n, &size);
-
- if (if_err(size >= SIZE_MAX - 1, EOVERFLOW) ||
+ if (if_err(slen(s, n, &size) >= SIZE_MAX - 1, EOVERFLOW) ||
if_err(off >= size, EOVERFLOW))
goto err;
@@ -453,7 +451,7 @@ dcat(const char *s, size_t n,
*dest2 = rval2;
errno = saved_errno;
- return 0;
+ return;
err:
*dest1 = *dest2 = NULL;
@@ -463,8 +461,6 @@ err:
(void) set_errno(saved_errno, EINVAL);
err_exit(errno, "dcat");
-
- return -1;
}
/* because no libc reimagination is complete
@@ -603,8 +599,9 @@ lbsetprogname(char *argv0)
static int set = 0;
if (!set) {
- if (argv0 == NULL || sdup(argv0, 4096, &progname) < 0)
+ if (argv0 == NULL)
return "libreboot-utils";
+ (void) sdup(argv0, 4096, &progname);
set = 1;
}