Merge "hnvram: Adding PARTITON_UNSPECIFIED"
diff --git a/libupgrade/hmx_upgrade_nvram.c b/libupgrade/hmx_upgrade_nvram.c
index fc1a52a..315c5e3 100644
--- a/libupgrade/hmx_upgrade_nvram.c
+++ b/libupgrade/hmx_upgrade_nvram.c
@@ -107,9 +107,15 @@
 
 #define NVRAM_RO_OFFSET         0x0
 #define NVRAM_RO_SIZE           0x00100000
-#define NVRAM_RW_OFFSET ( NVRAM_RO_OFFSET + NVRAM_RO_SIZE )
-#define NVRAM_RW_SIZE           0x00040000
-#define NVRAM_RWB_OFFSET        ( NVRAM_RW_OFFSET + NVRAM_RW_SIZE)
+#define NVRAM_RW_OFFSET         ( NVRAM_RO_OFFSET + NVRAM_RO_SIZE )
+/*
+ * Halve the size of the RW partition, so that it matches the
+ * size of the RW backup.  Add unused reserved space to ensure
+ * that the offsets remain consistent.
+ */
+#define NVRAM_RW_SIZE           0x00020000
+#define NVRAM_RESERVED_SIZE     0x00020000
+#define NVRAM_RWB_OFFSET        ( NVRAM_RW_OFFSET + NVRAM_RW_SIZE + NVRAM_RESERVED_SIZE)
 #define NVRAM_RWB_SIZE          0x00020000
 #define RAW_FS_OFFSET           ( NVRAM_RWB_OFFSET + NVRAM_RWB_SIZE)
 #define RAW_FS_SIZE             0x00020000
@@ -668,6 +674,7 @@
   unsigned char namelen;
   unsigned int valuelen;
   unsigned int recLen;
+  DRV_Error result;
 
   nvram_size = s_nvram_size[partition];
   buffer = malloc(nvram_size);
@@ -686,7 +693,8 @@
     recLen = env->recLen;
 
     if ((ptr + NVRAM_TYPE_LEN + NVRAM_RECORD_LENG_LEN + recLen) > buffer_end) {
-      break;
+      /* One or more variables don't fit into the partition. Fail the write. */
+      return DRV_ERR_OUTOFMEMORY;
     }
 
     *ptr++ = NVRAM_TLV_TYPE_ENV;        /* TLV record type */
@@ -718,10 +726,11 @@
     drv_NVRAM_Write(buffer,0+s_nvram_backup_offset[partition],ptr-buffer);
   }
 
+  result = (nvram_size == (unsigned int)(ptr-buffer)) ? DRV_OK :
+      DRV_ERR_EXTERNAL_ERROR;
   free(buffer);
 
-  return (nvram_size == (unsigned int)(ptr-buffer)) ? DRV_OK :
-      DRV_ERR_EXTERNAL_ERROR;
+  return result;
 }
 
 static unsigned int NVRAM_SWAP32(unsigned int A)