Only report "unknown metadata" once per restore helper
Also removes the auto-free object, replacing it with direct memory manipulation.
diff --git a/include/utils/BackupHelpers.h b/include/utils/BackupHelpers.h
index 759a0cc..b1f5045 100644
--- a/include/utils/BackupHelpers.h
+++ b/include/utils/BackupHelpers.h
@@ -137,6 +137,7 @@
private:
void* m_buf;
+ bool m_loggedUnknownMetadata;
KeyedVector<String8,FileRec> m_files;
};
diff --git a/libs/utils/BackupHelpers.cpp b/libs/utils/BackupHelpers.cpp
index b309dbf..99a4abc 100644
--- a/libs/utils/BackupHelpers.cpp
+++ b/libs/utils/BackupHelpers.cpp
@@ -68,15 +68,6 @@
const static int CURRENT_METADATA_VERSION = 1;
-// auto-free buffer management object
-class StAutoFree {
-public:
- StAutoFree(void* buffer) { mBuf = buffer; }
- ~StAutoFree() { free(mBuf); }
-private:
- void* mBuf;
-};
-
#if 1 // TEST_BACKUP_HELPERS
#define LOGP(f, x...) printf(f "\n", x)
#else
@@ -230,8 +221,6 @@
file_metadata_v1 metadata;
char* buf = (char*)malloc(bufsize);
- StAutoFree _autoFree(buf);
-
int crc = crc32(0L, Z_NULL, 0);
@@ -245,6 +234,7 @@
bytesLeft = fileSize + sizeof(metadata);
err = dataStream->WriteEntityHeader(key, bytesLeft);
if (err != 0) {
+ free(buf);
return err;
}
@@ -254,6 +244,7 @@
metadata.undefined_1 = metadata.undefined_2 = 0;
err = dataStream->WriteEntityData(&metadata, sizeof(metadata));
if (err != 0) {
+ free(buf);
return err;
}
bytesLeft -= sizeof(metadata); // bytesLeft should == fileSize now
@@ -266,6 +257,7 @@
}
err = dataStream->WriteEntityData(buf, amt);
if (err != 0) {
+ free(buf);
return err;
}
}
@@ -279,6 +271,7 @@
bytesLeft -= amt;
err = dataStream->WriteEntityData(buf, amt);
if (err != 0) {
+ free(buf);
return err;
}
}
@@ -287,6 +280,7 @@
" You aren't doing proper locking!", realFilename, fileSize, fileSize-bytesLeft);
}
+ free(buf);
return NO_ERROR;
}
@@ -318,8 +312,6 @@
int amt;
char* buf = (char*)malloc(bufsize);
- StAutoFree _autoFree(buf);
-
int crc = crc32(0L, Z_NULL, 0);
lseek(fd, 0, SEEK_SET);
@@ -328,6 +320,7 @@
crc = crc32(crc, (Bytef*)buf, amt);
}
+ free(buf);
return crc;
}
@@ -451,6 +444,7 @@
RestoreHelperBase::RestoreHelperBase()
{
m_buf = malloc(RESTORE_BUF_SIZE);
+ m_loggedUnknownMetadata = false;
}
RestoreHelperBase::~RestoreHelperBase()
@@ -489,8 +483,11 @@
metadata.version = fromlel(metadata.version);
metadata.mode = fromlel(metadata.mode);
if (metadata.version > CURRENT_METADATA_VERSION) {
- LOGW("Restoring file with unsupported metadata version %d (currently %d)",
- metadata.version, CURRENT_METADATA_VERSION);
+ if (!m_loggedUnknownMetadata) {
+ m_loggedUnknownMetadata = true;
+ LOGW("Restoring file with unsupported metadata version %d (currently %d)",
+ metadata.version, CURRENT_METADATA_VERSION);
+ }
}
mode = metadata.mode;
@@ -587,7 +584,6 @@
fprintf(stderr, "malloc(%d) failed\n", len);
return ENOMEM;
}
- StAutoFree _autoFree(contents);
bool sizesMatch = true;
amt = lseek(fd, 0, SEEK_END);
@@ -614,6 +610,7 @@
}
}
+ free(contents);
return contentsMatch && sizesMatch ? 0 : 1;
}
@@ -919,7 +916,6 @@
int err;
int bufSize = strlen(str)+1;
char* buf = (char*)malloc(bufSize);
- StAutoFree _autoFree(buf);
String8 string;
int cookie = 0x11111111;
size_t actualSize;
@@ -981,6 +977,7 @@
if (err != NO_ERROR) {
fprintf(stderr, "test_read_header_and_entity failed with %s\n", strerror(err));
}
+ free(buf);
return err;
}