lbutils: don't use stack memory for path strings

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-04-21 06:39:50 +01:00
parent 7faf014a84
commit e097eb5483
4 changed files with 43 additions and 9 deletions
+2
View File
@@ -366,6 +366,8 @@ int scmp(const char *a, const char *b,
size_t maxlen, int *rval); size_t maxlen, int *rval);
int ccmp(const char *a, const char *b, size_t i, int ccmp(const char *a, const char *b, size_t i,
int *rval); int *rval);
int dup_pair(char **dir, const char *d,
char **base, const char *b);
char *sdup(const char *s, char *sdup(const char *s,
size_t n, char **dest); size_t n, char **dest);
char *scatn(ssize_t sc, const char **sv, char *scatn(ssize_t sc, const char **sv,
+15 -8
View File
@@ -521,6 +521,8 @@ fs_dirname_basename(const char *path,
char *buf = NULL; char *buf = NULL;
char *slash; char *slash;
size_t len; size_t len;
const char *d = NULL;
const char *b = NULL;
errno = 0; errno = 0;
if (if_err(path == NULL || dir == NULL || base == NULL, EFAULT)) if (if_err(path == NULL || dir == NULL || base == NULL, EFAULT))
@@ -539,22 +541,27 @@ fs_dirname_basename(const char *path,
if (slash) { if (slash) {
*slash = '\0'; *slash = '\0';
*dir = buf; d = buf;
*base = slash + 1; b = slash + 1;
if (**dir == '\0') { if (*d == '\0')
(*dir)[0] = '/'; d = "/";
(*dir)[1] = '\0';
}
} else if (allow_relative) { } else if (allow_relative) {
sdup(".", PATH_MAX, dir); d = ".";
*base = buf; b = buf;
} else { } else {
free_and_set_null(&buf); free_and_set_null(&buf);
goto err; goto err;
} }
if (dup_pair(dir, d, base, b) < 0) {
free_and_set_null(&buf);
goto err;
}
free_and_set_null(&buf);
reset_caller_errno(0); reset_caller_errno(0);
return 0; return 0;
err: err:
+5 -1
View File
@@ -195,7 +195,11 @@ env_tmpdir(int bypass_all_sticky_checks, char **tmpdir,
bypass_all_sticky_checks)) bypass_all_sticky_checks))
goto err; goto err;
rval = t; rval = NULL;
if (t != NULL) {
if (sdup(t, PATH_MAX, &rval) == NULL)
goto err;
}
goto out; goto out;
} }
+21
View File
@@ -270,6 +270,27 @@ out:
return *rval; return *rval;
} }
int
dup_pair(char **dir, const char *d,
char **base, const char *b)
{
char *dtmp = NULL;
char *btmp = NULL;
if (d && sdup(d, PATH_MAX, &dtmp) == NULL)
return -1;
if (b && sdup(b, PATH_MAX, &btmp) == NULL) {
free(dtmp);
return -1;
}
*dir = dtmp;
*base = btmp;
return 0;
}
/* strict word-based strdup */ /* strict word-based strdup */
char * char *
sdup(const char *s, sdup(const char *s,