aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-07-20 22:02:34 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-07-23 11:22:43 -0700
commitb18b3119b54083c762f891c1ab98d10f20211482 (patch)
tree362bc58457d19a383a05b1d827d8da41a5e8fe0f
parent69914964f66f53c4ce413c780b97e52d015538e2 (diff)
downloadsubsurface-b18b3119b54083c762f891c1ab98d10f20211482.tar.gz
cleanup: don't NUL-terminate membuffer in uploadDiveLogsDE
The data of the membuffer is passed as a data/length pair to xmlReadMemory(). There is no point in NUL-terminating it. Moreover, pass the data directly to xmlReadMemory() instead of via variables. These variables are reused later with a different meaning, making this super-confusing. The membuf variable is turned from "const char *" to "char *" to signal that we own the buffer. Amazingly, zip_source_buffer() frees the buffer, even though a "const void *" is passed in. This API is pure madness. Add a comment. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/uploadDiveLogsDE.cpp8
1 files changed, 3 insertions, 5 deletions
diff --git a/core/uploadDiveLogsDE.cpp b/core/uploadDiveLogsDE.cpp
index 980800149..fc8ead6c3 100644
--- a/core/uploadDiveLogsDE.cpp
+++ b/core/uploadDiveLogsDE.cpp
@@ -94,7 +94,7 @@ bool uploadDiveLogsDE::prepareDives(const QString &tempfile, bool selected)
for_each_dive (i, dive) {
char filename[PATH_MAX];
int streamsize;
- const char *membuf;
+ char *membuf;
xmlDoc *transformed;
struct zip_source *s;
struct membufferpp mb;
@@ -137,14 +137,12 @@ bool uploadDiveLogsDE::prepareDives(const QString &tempfile, bool selected)
if (ds) {
put_format(&mb, "</divelog>\n");
}
- membuf = mb_cstring(&mb);
- streamsize = mb.len;
/*
* Parse the memory buffer into XML document and
* transform it to divelogs.de format, finally dumping
* the XML into a character buffer.
*/
- xmlDoc *doc = xmlReadMemory(membuf, streamsize, "divelog", NULL, 0);
+ xmlDoc *doc = xmlReadMemory(mb.buffer, mb.len, "divelog", NULL, 0);
if (!doc) {
qWarning() << errPrefix << "could not parse back into memory the XML file we've just created!";
report_error(tr("internal error").toUtf8());
@@ -171,7 +169,7 @@ bool uploadDiveLogsDE::prepareDives(const QString &tempfile, bool selected)
* Save the XML document into a zip file.
*/
snprintf(filename, PATH_MAX, "%d.xml", i + 1);
- s = zip_source_buffer(zip, membuf, streamsize, 1);
+ s = zip_source_buffer(zip, membuf, streamsize, 1); // frees membuffer!
if (s) {
int64_t ret = zip_add(zip, filename, s);
if (ret == -1)