mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-16 03:25:25 +02:00
mkhtemp: generalised string concatenation
scatn in strings.c was buggy, so i replaced it; it concatenates any number of things. Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
@@ -135,19 +135,12 @@ new_tmp_common(int *fd, char **path, int type,
|
|||||||
if (slen(templatestr, maxlen, &templatestr_len) < 0)
|
if (slen(templatestr, maxlen, &templatestr_len) < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* sizeof adds an extra byte, useful
|
/* may as well calculate in advance */
|
||||||
* because we also want '.' or '/'
|
|
||||||
*/
|
|
||||||
destlen = dirlen + 1 + templatestr_len;
|
destlen = dirlen + 1 + templatestr_len;
|
||||||
if (destlen > maxlen - 1) {
|
/* full path: */
|
||||||
errno = EOVERFLOW;
|
if (scatn(3, (const char *[]) { tmpdir, "/", templatestr },
|
||||||
|
maxlen, &dest) < 0)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(smalloc(&dest, destlen + 1), tmpdir, dirlen);
|
|
||||||
*(dest + dirlen) = '/';
|
|
||||||
memcpy(dest + dirlen + 1, templatestr, templatestr_len);
|
|
||||||
*(dest + destlen) = '\0';
|
|
||||||
|
|
||||||
fname = dest + dirlen + 1;
|
fname = dest + dirlen + 1;
|
||||||
|
|
||||||
|
|||||||
@@ -174,49 +174,45 @@ sdup(const char *s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* concatenate N number of strings */
|
/* concatenate N number of strings */
|
||||||
/* slen already checks null/termination */
|
|
||||||
int
|
int
|
||||||
scatn(ssize_t sc, const char **sv,
|
scatn(ssize_t sc, const char **sv,
|
||||||
size_t max, char **rval)
|
size_t max, char **rval)
|
||||||
{
|
{
|
||||||
ssize_t i = 0;
|
|
||||||
|
|
||||||
size_t ts = 0;
|
|
||||||
size_t *size = NULL;
|
|
||||||
|
|
||||||
char *ct = NULL;
|
|
||||||
int saved_errno = errno;
|
int saved_errno = errno;
|
||||||
|
|
||||||
if (if_err(sc <= 0, EINVAL) ||
|
char *final = NULL;
|
||||||
if_err(sc > SIZE_MAX / sizeof(size_t), EOVERFLOW) ||
|
char *rcur = NULL;
|
||||||
if_err(sv == NULL, EINVAL))
|
char *rtmp = NULL;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
if (if_err(sc < 2, EINVAL) ||
|
||||||
|
if_err(sv == NULL, EFAULT) ||
|
||||||
|
if_err(rval == NULL || *rval != NULL, EFAULT))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
vmalloc((void **)&size, sizeof(size_t) * sc);
|
for (i = 0; i < sc; i++) {
|
||||||
|
|
||||||
for (i = 0; i < sc; i++, ts += size[i])
|
if (i == 0) {
|
||||||
if (if_err(sv[i] == NULL, EINVAL) ||
|
if (sdup(sv[0], max, &final) < 0)
|
||||||
slen(sv[i], max, &size[i]) < 0 ||
|
goto err;
|
||||||
if_err(size[i] > max - 1, EOVERFLOW) ||
|
continue;
|
||||||
if_err((size[i] + ts) < ts, EOVERFLOW))
|
}
|
||||||
|
|
||||||
|
rtmp = NULL;
|
||||||
|
if (scat(final, sv[i], max, &rtmp) < 0)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
if (if_err(ts > SIZE_MAX - 1, EOVERFLOW) ||
|
free_and_set_null(&final);
|
||||||
if_err(ts > max - 1, EOVERFLOW))
|
final = rtmp;
|
||||||
goto err;
|
rtmp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
smalloc(&ct, ts + 1);
|
*rval = final;
|
||||||
for (ts = i = 0; i < sc; i++, ts += size[i])
|
|
||||||
memcpy(ct + ts, sv[i], size[i]);
|
|
||||||
|
|
||||||
*(ct + ts) = '\0';
|
|
||||||
*rval = ct;
|
|
||||||
|
|
||||||
errno = saved_errno;
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err:
|
||||||
free_and_set_null(&ct);
|
free_and_set_null(&rcur);
|
||||||
free_and_set_null((char **)&size);
|
free_and_set_null(&rtmp);
|
||||||
|
free_and_set_null(&final);
|
||||||
|
|
||||||
return set_errno(saved_errno, EFAULT);
|
return set_errno(saved_errno, EFAULT);
|
||||||
}
|
}
|
||||||
@@ -230,7 +226,7 @@ scat(const char *s1, const char *s2,
|
|||||||
size_t size2;
|
size_t size2;
|
||||||
char *rval = NULL;
|
char *rval = NULL;
|
||||||
|
|
||||||
if (dest == NULL ||
|
if (if_err(dest == NULL || *dest != NULL, EFAULT) ||
|
||||||
slen(s1, n, &size1) < 0 ||
|
slen(s1, n, &size1) < 0 ||
|
||||||
slen(s2, n, &size2) < 0 ||
|
slen(s2, n, &size2) < 0 ||
|
||||||
if_err(size1 > SIZE_MAX - size2 - 1, EOVERFLOW)) {
|
if_err(size1 > SIZE_MAX - size2 - 1, EOVERFLOW)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user