merge in lmp-release history after reset to 2efc9d994ce59f9ebfc2290c2adc5d760e8939c2
diff --git a/uncrypt/uncrypt.c b/uncrypt/uncrypt.c
index bce53db..77bfdc2 100644
--- a/uncrypt/uncrypt.c
+++ b/uncrypt/uncrypt.c
@@ -56,6 +56,8 @@
 #define RECOVERY_COMMAND_FILE_TMP "/cache/recovery/command.tmp"
 #define CACHE_BLOCK_MAP "/cache/recovery/block.map"
 
+static struct fstab* fstab = NULL;
+
 static int write_at_offset(unsigned char* buffer, size_t size,
                            int wfd, off64_t offset)
 {
@@ -101,8 +103,10 @@
     }
 }
 
-const char* find_block_device(const char* path, int* encryptable, int* encrypted)
+static struct fstab* read_fstab()
 {
+    fstab = NULL;
+
     // The fstab path is always "/fstab.${ro.hardware}".
     char fstab_path[PATH_MAX+1] = "/fstab.";
     if (!property_get("ro.hardware", fstab_path+strlen(fstab_path), "")) {
@@ -110,12 +114,17 @@
         return NULL;
     }
 
-    struct fstab* fstab = fs_mgr_read_fstab(fstab_path);
+    fstab = fs_mgr_read_fstab(fstab_path);
     if (!fstab) {
         fprintf(stderr, "failed to read %s\n", fstab_path);
         return NULL;
     }
 
+    return fstab;
+}
+
+const char* find_block_device(const char* path, int* encryptable, int* encrypted)
+{
     // Look for a volume whose mount point is the prefix of path and
     // return its block device.  Set encrypted if it's currently
     // encrypted.
@@ -302,6 +311,33 @@
     return 0;
 }
 
+void wipe_misc() {
+    int i;
+    for (i = 0; i < fstab->num_entries; ++i) {
+        struct fstab_rec* v = &fstab->recs[i];
+        if (!v->mount_point) continue;
+        if (strcmp(v->mount_point, "/misc") == 0) {
+            int fd = open(v->blk_device, O_RDWR);
+            uint8_t zeroes[1088];   // sizeof(bootloader_message) from recovery
+            memset(zeroes, 0, sizeof(zeroes));
+
+            size_t written = 0;
+            size_t size = sizeof(zeroes);
+            while (written < size) {
+                ssize_t w = write(fd, zeroes, size-written);
+                if (w < 0 && errno != EINTR) {
+                    fprintf(stderr, "zero write failed: %s\n", strerror(errno));
+                    return;
+                } else {
+                    written += w;
+                }
+            }
+
+            close(fd);
+        }
+    }
+}
+
 void reboot_to_recovery() {
     property_set("sys.powerctl", "reboot,recovery");
     sleep(10);
@@ -347,6 +383,9 @@
 
     int encryptable;
     int encrypted;
+    if (read_fstab() == NULL) {
+        return 1;
+    }
     const char* blk_dev = find_block_device(path, &encryptable, &encrypted);
     if (blk_dev == NULL) {
         fprintf(stderr, "failed to find block device for %s\n", path);
@@ -376,7 +415,8 @@
         }
     }
 
+    wipe_misc();
     rename(RECOVERY_COMMAND_FILE_TMP, RECOVERY_COMMAND_FILE);
-    reboot_to_recovery();
+    if (do_reboot) reboot_to_recovery();
     return 0;
 }