Successful partitions are never marked bad by cgptlib.

Change-Id: I70e54f59b540e9115bb6bd77ae51f49a1f4ab671

BUG=chromeos-partner:1029
TEST=make && make runtests

Review URL: http://codereview.chromium.org/3315014
diff --git a/firmware/lib/cgptlib/cgptlib.c b/firmware/lib/cgptlib/cgptlib.c
index a7f8d4e..20c0b9e 100644
--- a/firmware/lib/cgptlib/cgptlib.c
+++ b/firmware/lib/cgptlib/cgptlib.c
@@ -129,10 +129,12 @@
     }
     case GPT_UPDATE_ENTRY_BAD: {
       /* Giving up on this partition entirely. */
-      e->attrs.fields.gpt_att = previous_attr & ~(
-          CGPT_ATTRIBUTE_SUCCESSFUL_MASK |
-          CGPT_ATTRIBUTE_TRIES_MASK |
-          CGPT_ATTRIBUTE_PRIORITY_MASK);
+      if (!GetEntrySuccessful(e)) {
+        /* Only clear tries and priority if the successful bit is not set. */
+        e->attrs.fields.gpt_att = previous_attr & ~(
+            CGPT_ATTRIBUTE_TRIES_MASK |
+            CGPT_ATTRIBUTE_PRIORITY_MASK);
+      }
       break;
     }
     default:
diff --git a/firmware/version.c b/firmware/version.c
index 5e7eb9d..8c9abb5 100644
--- a/firmware/version.c
+++ b/firmware/version.c
@@ -1 +1 @@
-char* VbootVersion = "VBOOv=c4585ee1";
+char* VbootVersion = "VBOOv=77bb4724";
diff --git a/tests/cgptlib_test.c b/tests/cgptlib_test.c
index 891d53b..791815e 100644
--- a/tests/cgptlib_test.c
+++ b/tests/cgptlib_test.c
@@ -1068,17 +1068,12 @@
   EXPECT(4 == GetEntryPriority(e + KERNEL_A));
   EXPECT(0 == GetEntryTries(e + KERNEL_A));
   EXPECT(0 == gpt->modified);
-  /* Marking it bad does, though */
+  /* Marking it bad also does not update it. */
   EXPECT(GPT_SUCCESS == GptUpdateKernelEntry(gpt, GPT_UPDATE_ENTRY_BAD));
-  EXPECT(0 == GetEntrySuccessful(e + KERNEL_A));
-  EXPECT(0 == GetEntryPriority(e + KERNEL_A));
+  EXPECT(1 == GetEntrySuccessful(e + KERNEL_A));
+  EXPECT(4 == GetEntryPriority(e + KERNEL_A));
   EXPECT(0 == GetEntryTries(e + KERNEL_A));
-  /* Which affects both copies of the partition entries */
-  EXPECT(0 == GetEntrySuccessful(e2 + KERNEL_A));
-  EXPECT(0 == GetEntryPriority(e2 + KERNEL_A));
-  EXPECT(0 == GetEntryTries(e2 + KERNEL_A));
-  /* And that's caused the GPT to need updating */
-  EXPECT(0x0F == gpt->modified);
+  EXPECT(0 == gpt->modified);
 
   /* Kernel with tries */
   EXPECT(GPT_SUCCESS == GptNextKernelEntry(gpt, &start, &size));
@@ -1091,6 +1086,12 @@
   EXPECT(0 == GetEntrySuccessful(e + KERNEL_B));
   EXPECT(0 == GetEntryPriority(e + KERNEL_B));
   EXPECT(0 == GetEntryTries(e + KERNEL_B));
+  /* Which affects both copies of the partition entries */
+  EXPECT(0 == GetEntrySuccessful(e2 + KERNEL_B));
+  EXPECT(0 == GetEntryPriority(e2 + KERNEL_B));
+  EXPECT(0 == GetEntryTries(e2 + KERNEL_B));
+  /* And that's caused the GPT to need updating */
+  EXPECT(0x0F == gpt->modified);
 
   /* Another kernel with tries */
   EXPECT(GPT_SUCCESS == GptNextKernelEntry(gpt, &start, &size));