Merge pull request #3282 from datauwu/warc-reject-incomplete-resource-records

warc: reject incomplete resource records
This commit is contained in:
Dustin L. Howett authored and GitHub committed 2026-07-12 22:51:31 -05:00
commit d030af0ab7
2 files changed
+36 -1

No files matched your search

+8 -1
View File
@@ -313,8 +313,15 @@ _warc_finish_entry(struct archive_write *a)
struct warc_s *w = a->format_data;
if (w->typ == AE_IFREG) {
int rc = __archive_write_output(a, _eor, sizeof(_eor) - 1U);
int rc;
if (w->entry_bytes_remaining != 0U) {
archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
"WARC entry is shorter than Content-Length");
return (ARCHIVE_FATAL);
}
rc = __archive_write_output(a, _eor, sizeof(_eor) - 1U);
if (rc != ARCHIVE_OK) {
return rc;
}
+28
View File
@@ -169,3 +169,31 @@ DEFINE_TEST(test_write_format_warc_size)
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
DEFINE_TEST(test_write_format_warc_incomplete)
{
struct archive *a;
struct archive_entry *ae;
char buff[2048];
size_t used;
memset(buff, 0, sizeof(buff));
assert((a = archive_write_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_warc(a));
assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
assertEqualIntA(a, ARCHIVE_OK,
archive_write_open_memory(a, buff, sizeof(buff), &used));
assert((ae = archive_entry_new()) != NULL);
archive_entry_set_pathname(ae, "test");
archive_entry_set_filetype(ae, AE_IFREG);
archive_entry_set_size(ae, 9);
assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
archive_entry_free(ae);
assertEqualIntA(a, 8, archive_write_data(a, "12345678", 8));
assertEqualIntA(a, ARCHIVE_FATAL, archive_write_close(a));
assertEqualString("WARC entry is shorter than Content-Length",
archive_error_string(a));
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}