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;
 }