Emulator: Fix regression in fingerprint emulation

For the authenticator id regression.

bug: 25461612

(cherry picked from commit db43938923af7ac167639915932a5d58669798de)

Change-Id: I0bf9581216da213955e9ba1103e86479de30a866
diff --git a/fingerprint/fingerprint.c b/fingerprint/fingerprint.c
index a323e0b..6f30eb3 100644
--- a/fingerprint/fingerprint.c
+++ b/fingerprint/fingerprint.c
@@ -70,6 +70,7 @@
     worker_state_t state;
     uint64_t secureid[MAX_NUM_FINGERS];
     uint64_t authenid[MAX_NUM_FINGERS];
+    uint64_t fingerid[MAX_NUM_FINGERS];
 } worker_thread_t;
 
 typedef struct qemu_fingerprint_device_t {
@@ -113,6 +114,7 @@
         return;
     }
     int ns = fwrite(&listener->secureid[idx], sizeof(uint64_t), 1, fp);
+
     if (fseek(fp, (MAX_NUM_FINGERS + idx) * sizeof(uint64_t), SEEK_SET) < 0) {
         ALOGE("Failed while seeking for fingerprint[%d] in emulator storage",
               idx);
@@ -120,7 +122,14 @@
         return;
     }
     int na = fwrite(&listener->authenid[idx], sizeof(uint64_t), 1, fp);
-    if (ns != 1 || na != 1)
+    if (fseek(fp, (2*MAX_NUM_FINGERS + idx) * sizeof(uint64_t), SEEK_SET) < 0) {
+        ALOGE("Failed while seeking for fingerprint[%d] in emulator storage",
+              idx);
+        fclose(fp);
+        return;
+    }
+    int nf = fwrite(&listener->fingerid[idx], sizeof(uint64_t), 1, fp);
+    if (ns != 1 || na != 1 || ns !=1)
         ALOGW("Corrupt emulator fingerprints storage; could not save "
               "fingerprints");
 
@@ -144,7 +153,9 @@
                    fp);
     int na = fread(listener->authenid, MAX_NUM_FINGERS * sizeof(uint64_t), 1,
                    fp);
-    if (ns != 1 || na != 1)
+    int nf = fread(listener->fingerid, MAX_NUM_FINGERS * sizeof(uint64_t), 1,
+                   fp);
+    if (ns != 1 || na != 1 || nf != 1)
         ALOGW("Corrupt emulator fingerprints storage (read %d+%db)", ns, na);
 
     int i = 0;
@@ -325,7 +336,7 @@
     unsigned int i = 0;
     for (i = 0; i < MAX_NUM_FINGERS; i++) {
         if (qdev->listener.secureid[i] != 0 ||
-            qdev->listener.authenid[i] != 0) {
+            qdev->listener.fingerid[i] != 0) {
             ALOGD("ENUM: Fingerprint [%d] = 0x%" PRIx64 ",%" PRIx64, i,
                   qdev->listener.secureid[i], qdev->listener.authenid[i]);
         }
@@ -357,11 +368,12 @@
             pthread_mutex_lock(&qdev->lock);
             listIsEmpty = true;  // Haven't seen a valid entry yet
             for (idx = 0; idx < MAX_NUM_FINGERS; idx++) {
-                uint32_t theFid = qdev->listener.authenid[idx];
+                uint32_t theFid = qdev->listener.fingerid[idx];
                 if (theFid != 0) {
                     // Delete this entry
                     qdev->listener.secureid[idx] = 0;
                     qdev->listener.authenid[idx] = 0;
+                    qdev->listener.fingerid[idx] = 0;
                     saveFingerprint(&qdev->listener, idx);
 
                     // Send a notification that we deleted this one
@@ -385,7 +397,8 @@
         // Look for this finger ID in our table.
         pthread_mutex_lock(&qdev->lock);
         for (idx = 0; idx < MAX_NUM_FINGERS; idx++) {
-            if (qdev->listener.authenid[idx] == fid &&
+            if (qdev->listener.fingerid[idx] == fid &&
+                qdev->listener.authenid[idx] != 0 &&
                 qdev->listener.secureid[idx] != 0) {
                 // Found it!
                 break;
@@ -400,6 +413,7 @@
 
         qdev->listener.secureid[idx] = 0;
         qdev->listener.authenid[idx] = 0;
+        qdev->listener.fingerid[idx] = 0;
         saveFingerprint(&qdev->listener, idx);
 
         qdev->listener.state = STATE_IDLE;
@@ -436,7 +450,8 @@
     int idx = 0;
     if (0 == fid) { return false; }
     for (idx = 0; idx < MAX_NUM_FINGERS; idx++) {
-        if (qdev->listener.authenid[idx] == fid) {
+        if (qdev->listener.fingerid[idx] == fid) {
+            qdev->authenticator_id = qdev->listener.authenid[idx];
             return true;
         }
     }
@@ -487,12 +502,14 @@
         return;
     }
 
+    qdev->authenticator_id = get_64bit_rand();
     // Find an available entry in the table
     pthread_mutex_lock(&qdev->lock);
     int idx = 0;
     for (idx = 0; idx < MAX_NUM_FINGERS; idx++) {
         if (qdev->listener.secureid[idx] == 0 ||
-            qdev->listener.authenid[idx] == 0) {
+            qdev->listener.authenid[idx] == 0 ||
+            qdev->listener.fingerid[idx] == 0) {
             // This entry is available
             break;
         }
@@ -505,7 +522,8 @@
     }
 
     qdev->listener.secureid[idx] = qdev->secure_user_id;
-    qdev->listener.authenid[idx] = fid;
+    qdev->listener.authenid[idx] = qdev->authenticator_id;
+    qdev->listener.fingerid[idx] = fid;
     saveFingerprint(&qdev->listener, idx);
 
     qdev->listener.state = STATE_SCAN;