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);
|
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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user