libreboot-utils: safe memcmp

Signed-off-by: Leah Rowe <leah@libreboot.org>
This commit is contained in:
Leah Rowe
2026-03-29 22:15:27 +01:00
parent 01aa95ec15
commit 7fb0b2f692
5 changed files with 38 additions and 4 deletions
+2 -2
View File
@@ -143,7 +143,7 @@ read_file(void)
if (_r < 0)
err_exit(errno, "%s: read failed (cmp)", f->tname);
if (memcmp(f->buf, f->bufcmp, f->gbe_file_size) != 0)
if (vcmp(f->buf, f->bufcmp, f->gbe_file_size) != 0)
err_exit(errno, "%s: %s: read contents differ (pre-test)",
f->fname, f->tname);
}
@@ -329,7 +329,7 @@ check_written_part(size_t p)
f->rw_check_err_read[p] = f->io_err_gbe = 1;
else if ((size_t)rval != gbe_rw_size)
f->rw_check_partial_read[p] = f->io_err_gbe = 1;
else if (memcmp(mem_offset, f->pad, gbe_rw_size) != 0)
else if (vcmp(mem_offset, f->pad, gbe_rw_size) != 0)
f->rw_check_bad_part[p] = f->io_err_gbe = 1;
if (f->rw_check_err_read[p] ||
+1 -1
View File
@@ -567,7 +567,7 @@ mkhtemp(int *fd,
if_err(fname_len > template_len, EOVERFLOW))
return -1;
if (if_err(memcmp(fname, template + template_len - fname_len,
if (if_err(vcmp(fname, template + template_len - fname_len,
fname_len) != 0, EINVAL))
return -1;
+33
View File
@@ -292,6 +292,39 @@ err:
return -1;
}
/* because no libc reimagination is complete
* without a reimplementation of memcmp. and
* no safe one is complete without null checks.
*/
int
vcmp(const void *s1, const void *s2, size_t n)
{
size_t i = 0;
size_t a;
size_t b;
if (if_err(s1 == NULL || s2 == NULL, EFAULT))
err_exit(EFAULT, "vcmp: null input");
const unsigned char *x = s1;
const unsigned char *y = s2;
for ( ; i + sizeof(size_t) <= n; i += sizeof(size_t)) {
memcpy(&a, x + i, sizeof(size_t));
memcpy(&b, y + i, sizeof(size_t));
if (a != b)
break;
}
for ( ; i < n; i++)
if (x[i] != y[i])
return (int)x[i] - (int)y[i];
return 0;
}
/* on functions that return with errno,
* i sometimes have a default fallback,
* which is set if errno wasn't changed,