bin/xbps-rindex: better error handling for writing repodata archives

This fixes issues when writes fail (as example if the disk is full),
where xbps would create empty repodata or stagedata archives.
This commit is contained in:
Duncan Overbruck authored and Juan RP committed 2019-10-25 23:36:44 +02:00
1 parent 04d5554ed2
commit 7b4a925302
2 files changed
+34 -22

No files matched your search

+28 -20
View File
@@ -60,34 +60,37 @@ repodata_flush(struct xbps_handle *xhp, const char *repodir,
umask(mask);
/* Create and write our repository archive */
ar = archive_write_new();
assert(ar);
if (ar == NULL)
return false;
if (compression == NULL || strcmp(compression, "gzip") == 0) {
archive_write_add_filter_gzip(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "bzip2") == 0) {
archive_write_add_filter_bzip2(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "lz4") == 0) {
archive_write_add_filter_lz4(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "xz") == 0) {
archive_write_add_filter_xz(ar);
} else if (strcmp(compression, "zstd") == 0) {
archive_write_add_filter_zstd(ar);
archive_write_set_options(ar, "compression-level=19");
if (compression == NULL || strcmp(compression, "gzip") == 0) {
archive_write_add_filter_gzip(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "bzip2") == 0) {
archive_write_add_filter_bzip2(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "lz4") == 0) {
archive_write_add_filter_lz4(ar);
archive_write_set_options(ar, "compression-level=9");
} else if (strcmp(compression, "xz") == 0) {
archive_write_add_filter_xz(ar);
} else if (strcmp(compression, "zstd") == 0) {
archive_write_add_filter_zstd(ar);
archive_write_set_options(ar, "compression-level=19");
} else if (strcmp(compression, "none") == 0) {
/* empty */
} else {
/* empty */
} else {
return false;
}
archive_write_set_format_pax_restricted(ar);
archive_write_open_fd(ar, repofd);
if (archive_write_open_fd(ar, repofd) != ARCHIVE_OK)
return false;
/* XBPS_REPOIDX */
buf = xbps_dictionary_externalize(idx);
assert(buf);
if (buf == NULL)
return false;
rv = xbps_archive_append_buf(ar, buf, strlen(buf),
XBPS_REPOIDX, 0644, "root", "root");
free(buf);
@@ -98,6 +101,8 @@ repodata_flush(struct xbps_handle *xhp, const char *repodir,
if (meta == NULL) {
/* fake entry */
buf = strdup("DEADBEEF");
if (buf == NULL)
return false;
} else {
buf = xbps_dictionary_externalize(meta);
}
@@ -108,7 +113,10 @@ repodata_flush(struct xbps_handle *xhp, const char *repodir,
return false;
/* Write data to tempfile and rename */
archive_write_finish(ar);
if (archive_write_close(ar) != ARCHIVE_OK)
return false;
if (archive_write_free(ar) != ARCHIVE_OK)
return false;
#ifdef HAVE_FDATASYNC
fdatasync(repofd);
#else
+6 -2
View File
@@ -83,7 +83,8 @@ xbps_archive_append_buf(struct archive *ar, const void *buf, const size_t buflen
assert(gname);
entry = archive_entry_new();
assert(entry);
if (entry == NULL)
return archive_errno(ar);
archive_entry_set_filetype(entry, AE_IFREG);
archive_entry_set_perm(entry, mode);
@@ -100,7 +101,10 @@ xbps_archive_append_buf(struct archive *ar, const void *buf, const size_t buflen
archive_entry_free(entry);
return archive_errno(ar);
}
archive_write_finish_entry(ar);
if (archive_write_finish_entry(ar) != ARCHIVE_OK) {
archive_entry_free(entry);
return archive_errno(ar);
}
archive_entry_free(entry);
return 0;