The fstab.extra merge prepends the existing credential via
asprintf("%.*s", (int) existing->size, …). MachineCredential.size is
size_t, so for a credential >INT_MAX the (int) cast yields a negative
precision, which C treats as omitted — turning %.*s into an unbounded
read past the allocation. Reject such a credential up front with EFBIG;
for all realistic sizes the merge is unchanged.
Co-developed-by: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Paul Meyer <katexochen0@gmail.com>
if (existing) {
_cleanup_free_ char *combined = NULL;
+ if (existing->size >= INT_MAX)
+ return log_error_errno(SYNTHETIC_ERRNO(EFBIG),
+ "Existing fstab.extra credential is too large (%zu bytes).",
+ existing->size);
+
if (existing->size > 0 && existing->data[existing->size - 1] != '\n')
r = asprintf(&combined, "%.*s\n%s", (int) existing->size, existing->data, fstab_extra);
else