mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 05:52:36 +02:00
lbutils: don't use stack memory for path strings
Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
@@ -366,6 +366,8 @@ int scmp(const char *a, const char *b,
|
||||
size_t maxlen, int *rval);
|
||||
int ccmp(const char *a, const char *b, size_t i,
|
||||
int *rval);
|
||||
int dup_pair(char **dir, const char *d,
|
||||
char **base, const char *b);
|
||||
char *sdup(const char *s,
|
||||
size_t n, char **dest);
|
||||
char *scatn(ssize_t sc, const char **sv,
|
||||
|
||||
@@ -521,6 +521,8 @@ fs_dirname_basename(const char *path,
|
||||
char *buf = NULL;
|
||||
char *slash;
|
||||
size_t len;
|
||||
const char *d = NULL;
|
||||
const char *b = NULL;
|
||||
errno = 0;
|
||||
|
||||
if (if_err(path == NULL || dir == NULL || base == NULL, EFAULT))
|
||||
@@ -539,22 +541,27 @@ fs_dirname_basename(const char *path,
|
||||
if (slash) {
|
||||
|
||||
*slash = '\0';
|
||||
*dir = buf;
|
||||
*base = slash + 1;
|
||||
d = buf;
|
||||
b = slash + 1;
|
||||
|
||||
if (**dir == '\0') {
|
||||
(*dir)[0] = '/';
|
||||
(*dir)[1] = '\0';
|
||||
}
|
||||
if (*d == '\0')
|
||||
d = "/";
|
||||
} else if (allow_relative) {
|
||||
|
||||
sdup(".", PATH_MAX, dir);
|
||||
*base = buf;
|
||||
d = ".";
|
||||
b = buf;
|
||||
} else {
|
||||
free_and_set_null(&buf);
|
||||
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);
|
||||
return 0;
|
||||
err:
|
||||
|
||||
@@ -195,7 +195,11 @@ env_tmpdir(int bypass_all_sticky_checks, char **tmpdir,
|
||||
bypass_all_sticky_checks))
|
||||
goto err;
|
||||
|
||||
rval = t;
|
||||
rval = NULL;
|
||||
if (t != NULL) {
|
||||
if (sdup(t, PATH_MAX, &rval) == NULL)
|
||||
goto err;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -270,6 +270,27 @@ out:
|
||||
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 */
|
||||
char *
|
||||
sdup(const char *s,
|
||||
|
||||
Reference in New Issue
Block a user