Merge pull request #3284 from datauwu/warc-propagate-generated-header-errors

warc: propagate generated header errors
This commit is contained in:
Dustin L. Howett authored and GitHub committed 2026-07-14 08:38:29 -05:00
commit 9e0bae9458
2 files changed
+81 -13

No files matched your search

+29 -13
View File
@@ -193,6 +193,7 @@ _warc_header(struct archive_write *a, struct archive_entry *entry)
/* Emit the warcinfo record if needed. */
if (!w->omit_warcinfo) {
ssize_t r;
int rc;
warc_essential_hdr_t wi = {
WT_INFO,
/* URI */NULL,
@@ -207,17 +208,27 @@ _warc_header(struct archive_write *a, struct archive_entry *entry)
archive_string_init(&hdr);
r = _popul_ehdr(&hdr, MAX_HDR_SIZE, wi);
if (r >= 0) {
/* Header was populated successfully. */
/* Reuse the header buffer for the warcinfo payload. */
archive_strncat(&hdr, warcinfo, sizeof(warcinfo) -1);
/* Append the end-of-record indicator. */
archive_strncat(&hdr, "\r\n\r\n", 4);
/* Write the warcinfo record to the output stream. */
__archive_write_output(a, hdr.s, archive_strlen(&hdr));
if (r < 0) {
archive_string_free(&hdr);
archive_set_error(&a->archive,
ARCHIVE_ERRNO_FILE_FORMAT,
"Cannot archive warcinfo record");
return (ARCHIVE_FAILED);
}
/* Reuse the header buffer for the warcinfo payload. */
archive_strncat(&hdr, warcinfo, sizeof(warcinfo) -1);
/* Append the end-of-record indicator. */
archive_strncat(&hdr, "\r\n\r\n", 4);
/* Write the warcinfo record to the output stream. */
rc = __archive_write_output(a, hdr.s, archive_strlen(&hdr));
if (rc != ARCHIVE_OK) {
archive_string_free(&hdr);
return (rc);
}
/* Mark the file header as written. */
w->omit_warcinfo = 1U;
archive_string_free(&hdr);
@@ -242,6 +253,7 @@ _warc_header(struct archive_write *a, struct archive_entry *entry)
/* Content length */0,
};
ssize_t r;
int rc;
int64_t size;
rh.tgturi = archive_entry_pathname(entry);
rh.rtime = w->now;
@@ -267,11 +279,15 @@ _warc_header(struct archive_write *a, struct archive_entry *entry)
archive_set_error(
&a->archive,
ARCHIVE_ERRNO_FILE_FORMAT,
"cannot archive file");
return (ARCHIVE_WARN);
"WARC resource header is too large");
return (ARCHIVE_FATAL);
}
/* Append the header to the output stream. */
__archive_write_output(a, hdr.s, r);
rc = __archive_write_output(a, hdr.s, r);
if (rc != ARCHIVE_OK) {
archive_string_free(&hdr);
return (rc);
}
/* Save the remaining size for subsequent _data() calls. */
w->entry_bytes_remaining = rh.cntlen;
archive_string_free(&hdr);
+52
View File
@@ -197,3 +197,55 @@ DEFINE_TEST(test_write_format_warc_incomplete)
archive_error_string(a));
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
DEFINE_TEST(test_write_format_warc_warcinfo_output_error)
{
struct archive *a;
struct archive_entry *ae;
char buff[1];
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_set_bytes_per_block(a, 1));
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, 1);
assertEqualIntA(a, ARCHIVE_FATAL, archive_write_header(a, ae));
archive_entry_free(ae);
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
DEFINE_TEST(test_write_format_warc_resource_output_error)
{
struct archive *a;
struct archive_entry *ae;
char buff[1];
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_set_format_option(a, NULL, "omit-warcinfo", NULL));
assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a));
assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 1));
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, 1);
assertEqualIntA(a, ARCHIVE_FATAL, archive_write_header(a, ae));
archive_entry_free(ae);
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}