Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac134476 authored by Roman Birg's avatar Roman Birg Committed by Gerrit Code Review
Browse files

FingerprintService: synchronize access to clients



They are not thread safe.

Ref: CYNGNOS-1213

Change-Id: I3f69279c732db73746279c0359c1ff4ee661839d
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 8640db2e
Loading
Loading
Loading
Loading
+90 −81
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * A service to manage multiple clients that want to access the fingerprint HAL API.
@@ -65,7 +66,8 @@ public class FingerprintService extends SystemService {

    private static final String PARAM_WAKEUP = "wakeup";

    private ArrayMap<IBinder, ClientData> mClients = new ArrayMap<IBinder, ClientData>();
    private final Map<IBinder, ClientData> mClients
            = Collections.synchronizedMap(new ArrayMap<IBinder, ClientData>());

    private static final int MSG_NOTIFY = 10;

@@ -159,8 +161,10 @@ public class FingerprintService extends SystemService {
    void handleNotify(int msg, int arg1, int arg2) {
        Slog.v(TAG, "handleNotify(msg=" + msg + ", arg1=" + arg1 + ", arg2=" + arg2 + ")");
        int newState = mState;
        for (Iterator<Map.Entry<IBinder, ClientData>> it = mClients.entrySet().iterator();
                it.hasNext(); ) {
        final Set<Map.Entry<IBinder, ClientData>> entries = mClients.entrySet();
        synchronized (mClients) {
            final Iterator<Map.Entry<IBinder, ClientData>> it = entries.iterator();
            while (it.hasNext()) {
                final Map.Entry<IBinder, ClientData> entry = it.next();
                IBinder client = entry.getKey();
                ClientData clientData = entry.getValue();
@@ -241,7 +245,8 @@ public class FingerprintService extends SystemService {
                    }
                    case FingerprintManager.FINGERPRINT_TEMPLATE_REMOVED: {
                        int fingerId = arg1;
                    if (fingerId == 0) throw new IllegalStateException("Got illegal id from HAL");
                        if (fingerId == 0)
                            throw new IllegalStateException("Got illegal id from HAL");
                        FingerprintUtils.removeFingerprintIdForUser(fingerId,
                                mContext.getContentResolver(), clientData.userId);
                        try {
@@ -256,6 +261,7 @@ public class FingerprintService extends SystemService {
                    break;
                }
            }
        }
        changeState(newState);
    }

@@ -365,8 +371,10 @@ public class FingerprintService extends SystemService {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                for (Iterator<Map.Entry<IBinder, ClientData>> it = mClients.entrySet().iterator();
                     it.hasNext(); ) {
                final Set<Map.Entry<IBinder, ClientData>> entries = mClients.entrySet();
                synchronized (mClients) {
                    final Iterator<Map.Entry<IBinder, ClientData>> it = entries.iterator();
                    while (it.hasNext()) {
                        try {
                            ClientData clientData = it.next().getValue();
                            if (clientData != null && clientData.receiver != null) {
@@ -378,6 +386,7 @@ public class FingerprintService extends SystemService {
                        }
                    }
                }
            }
        });
    }