From: Eric Biggers Date: Sat, 7 Dec 2013 00:40:57 +0000 (-0600) Subject: xml.c: Fix writing element X-Git-Tag: v1.5.3~14 X-Git-Url: https://wimlib.net/git/?p=wimlib;a=commitdiff_plain;h=db52422f8a9e87e7d160b68b3271d26c41f0687e xml.c: Fix writing element A positive return value of xmlTextWriterEndElement would be incorrectly passed up the call chain, causing an unexpected error when writing the XML data. --- diff --git a/src/integrity.c b/src/integrity.c index 0bfb8050..b83b9c06 100644 --- a/src/integrity.c +++ b/src/integrity.c @@ -328,6 +328,10 @@ write_integrity_table(WIMStruct *wim, int ret; u32 new_table_size; + DEBUG("Writing integrity table " + "(new_lookup_table_end=%"PRIu64", old_lookup_table_end=%"PRIu64")", + new_lookup_table_end, old_lookup_table_end); + wimlib_assert(old_lookup_table_end <= new_lookup_table_end); old_table = NULL; @@ -368,6 +372,7 @@ write_integrity_table(WIMStruct *wim, FREE(new_table); out_free_old_table: FREE(old_table); + DEBUG("ret=%d", ret); return ret; } diff --git a/src/lookup_table.c b/src/lookup_table.c index 9109c481..553cf33b 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -716,6 +716,7 @@ write_wim_lookup_table_from_stream_list(struct list_head *stream_list, write_resource_flags, comp_ctx); FREE(table_buf); + DEBUG("ret=%d", ret); return ret; } diff --git a/src/write.c b/src/write.c index 6c97c796..d728e545 100644 --- a/src/write.c +++ b/src/write.c @@ -2140,10 +2140,12 @@ close_wim_writable(WIMStruct *wim, int write_flags) { int ret = 0; - if (!(write_flags & WIMLIB_WRITE_FLAG_FILE_DESCRIPTOR)) + if (!(write_flags & WIMLIB_WRITE_FLAG_FILE_DESCRIPTOR)) { + DEBUG("Closing WIM file."); if (filedes_valid(&wim->out_fd)) if (filedes_close(&wim->out_fd)) ret = WIMLIB_ERR_WRITE; + } filedes_invalidate(&wim->out_fd); return ret; } @@ -2206,6 +2208,8 @@ finish_write(WIMStruct *wim, int image, int write_flags, off_t new_lookup_table_end; u64 xml_totalbytes; + DEBUG("image=%d, write_flags=%08x", image, write_flags); + write_resource_flags = write_flags_to_resource_flags(write_flags); /* In the WIM header, there is room for the resource entry for a @@ -2280,6 +2284,7 @@ finish_write(WIMStruct *wim, int image, int write_flags, hdr_offset = 0; if (write_flags & WIMLIB_WRITE_FLAG_HEADER_AT_END) hdr_offset = wim->out_fd.offset; + DEBUG("Writing new header @ %"PRIu64".", hdr_offset); ret = write_wim_header_at_offset(&wim->hdr, &wim->out_fd, hdr_offset); if (ret) return ret; @@ -2291,6 +2296,7 @@ finish_write(WIMStruct *wim, int image, int write_flags, * operation has been written to disk, but the new file data has not. */ if (write_flags & WIMLIB_WRITE_FLAG_FSYNC) { + DEBUG("Syncing WIM file."); if (fsync(wim->out_fd.fd)) { ERROR_WITH_ERRNO("Error syncing data to WIM file"); return WIMLIB_ERR_WRITE; @@ -2687,6 +2693,7 @@ write_wim_part(WIMStruct *wim, out_restore_hdr: memcpy(&wim->hdr, &hdr_save, sizeof(struct wim_header)); (void)close_wim_writable(wim, write_flags); + DEBUG("ret=%d", ret); return ret; } diff --git a/src/xml.c b/src/xml.c index b22bc094..5258aaf4 100644 --- a/src/xml.c +++ b/src/xml.c @@ -752,7 +752,11 @@ xml_write_windows_version(xmlTextWriter *writer, if (rc < 0) return rc; - return xmlTextWriterEndElement(writer); /* */ + rc = xmlTextWriterEndElement(writer); /* */ + if (rc < 0) + return rc; + + return 0; } /* Writes the information contained in a `struct windows_info' to the XML @@ -802,16 +806,19 @@ xml_write_windows_info(xmlTextWriter *writer, if (windows_info->windows_version_exists) { rc = xml_write_windows_version(writer, &windows_info->windows_version); - if (rc < 0) + if (rc) return rc; } - rc = xml_write_string(writer, "SYSTEMROOT", - windows_info->system_root); + rc = xml_write_string(writer, "SYSTEMROOT", windows_info->system_root); if (rc) return rc; - return xmlTextWriterEndElement(writer); /* */ + rc = xmlTextWriterEndElement(writer); /* */ + if (rc < 0) + return rc; + + return 0; } /* Writes a time element to the XML document being constructed in memory. */ @@ -897,6 +904,7 @@ xml_write_image_info(xmlTextWriter *writer, const struct image_info *image_info) rc = xmlTextWriterEndElement(writer); /* */ if (rc < 0) return rc; + return 0; } @@ -1480,6 +1488,7 @@ out_output_buffer_close: out_buffer_free: xmlBufferFree(buf); out: + DEBUG("ret=%d", ret); return ret; out_write_error: @@ -1518,6 +1527,7 @@ write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes, write_resource_flags, &wim->lzx_context); FREE(xml_data); + DEBUG("ret=%d"); return ret; }