From ecfd7f7d9588728a4579fab8af1722cefeb32d40 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 8 Oct 2010 14:23:40 -0700 Subject: Maybe fix #3076572: phone process crashes in SipService, trying to get wifi lock WifiService needs to keep the calling identity cleared while it is doing all of its internal work. Change-Id: I2bd720e26efcf5ad5839693307d61e51f0658ace --- services/java/com/android/server/WifiService.java | 40 +++++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index 3d95bf0f2683..a63b3d8d45f8 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -2163,12 +2163,12 @@ public class WifiService extends IWifiManager.Stub { if (DBG) throw new IllegalArgumentException("lockMode=" + lockMode); return false; } - if (ws != null) { - enforceWakeSourcePermission(Binder.getCallingUid(), Binder.getCallingPid()); - } if (ws != null && ws.size() == 0) { ws = null; } + if (ws != null) { + enforceWakeSourcePermission(Binder.getCallingUid(), Binder.getCallingPid()); + } if (ws == null) { ws = new WorkSource(Binder.getCallingUid()); } @@ -2227,17 +2227,18 @@ public class WifiService extends IWifiManager.Stub { ++mScanLocksAcquired; break; } + + // Be aggressive about adding new locks into the accounted state... + // we want to over-report rather than under-report. + reportStartWorkSource(); + + updateWifiState(); + return true; } catch (RemoteException e) { + return false; } finally { Binder.restoreCallingIdentity(ident); } - - // Be aggressive about adding new locks into the accounted state... - // we want to over-report rather than under-report. - reportStartWorkSource(); - - updateWifiState(); - return true; } public void updateWifiLockWorkSource(IBinder lock, WorkSource ws) { @@ -2283,9 +2284,9 @@ public class WifiService extends IWifiManager.Stub { hadLock = (wifiLock != null); - if (hadLock) { - long ident = Binder.clearCallingIdentity(); - try { + long ident = Binder.clearCallingIdentity(); + try { + if (hadLock) { noteAcquireWifiLock(wifiLock); switch(wifiLock.mMode) { case WifiManager.WIFI_MODE_FULL: @@ -2298,13 +2299,16 @@ public class WifiService extends IWifiManager.Stub { ++mScanLocksReleased; break; } - } catch (RemoteException e) { - } finally { - Binder.restoreCallingIdentity(ident); } + + // TODO - should this only happen if you hadLock? + updateWifiState(); + + } catch (RemoteException e) { + } finally { + Binder.restoreCallingIdentity(ident); } - // TODO - should this only happen if you hadLock? - updateWifiState(); + return hadLock; } -- cgit v1.2.3-59-g8ed1b