diff options
Diffstat (limited to 'services')
20 files changed, 180 insertions, 66 deletions
diff --git a/services/java/Android.mk b/services/java/Android.mk index c756d29..e70a6c9 100644 --- a/services/java/Android.mk +++ b/services/java/Android.mk @@ -11,7 +11,7 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE:= services -LOCAL_JAVA_LIBRARIES := android.policy +LOCAL_JAVA_LIBRARIES := android.policy telephony-common LOCAL_NO_EMMA_INSTRUMENT := true LOCAL_NO_EMMA_COMPILE := true diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 7bbc8b5..86ada40 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -77,6 +77,7 @@ import android.util.SparseIntArray; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; @@ -1008,7 +1009,7 @@ private NetworkStateTracker makeWimaxStateTracker() { try { if (!ConnectivityManager.isNetworkTypeValid(networkType) || mNetConfigs[networkType] == null) { - return Phone.APN_REQUEST_FAILED; + return PhoneConstants.APN_REQUEST_FAILED; } FeatureUser f = new FeatureUser(networkType, feature, binder); @@ -1027,7 +1028,7 @@ private NetworkStateTracker makeWimaxStateTracker() { uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL); } if (networkMetered && (uidRules & RULE_REJECT_METERED) != 0) { - return Phone.APN_REQUEST_FAILED; + return PhoneConstants.APN_REQUEST_FAILED; } NetworkStateTracker network = mNetTrackers[usedNetworkType]; @@ -1039,7 +1040,7 @@ private NetworkStateTracker makeWimaxStateTracker() { if (ni.isAvailable() == false) { if (!TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN_ALWAYS)) { if (DBG) log("special network not available ni=" + ni.getTypeName()); - return Phone.APN_TYPE_NOT_AVAILABLE; + return PhoneConstants.APN_TYPE_NOT_AVAILABLE; } else { // else make the attempt anyway - probably giving REQUEST_STARTED below if (DBG) { @@ -1088,10 +1089,10 @@ private NetworkStateTracker makeWimaxStateTracker() { } finally { Binder.restoreCallingIdentity(token); } - return Phone.APN_ALREADY_ACTIVE; + return PhoneConstants.APN_ALREADY_ACTIVE; } if (VDBG) log("special network already connecting"); - return Phone.APN_REQUEST_STARTED; + return PhoneConstants.APN_REQUEST_STARTED; } // check if the radio in play can make another contact @@ -1102,7 +1103,7 @@ private NetworkStateTracker makeWimaxStateTracker() { feature); } network.reconnect(); - return Phone.APN_REQUEST_STARTED; + return PhoneConstants.APN_REQUEST_STARTED; } else { // need to remember this unsupported request so we respond appropriately on stop synchronized(this) { @@ -1115,7 +1116,7 @@ private NetworkStateTracker makeWimaxStateTracker() { return -1; } } - return Phone.APN_TYPE_NOT_AVAILABLE; + return PhoneConstants.APN_TYPE_NOT_AVAILABLE; } finally { if (DBG) { final long execTime = SystemClock.elapsedRealtime() - startTime; @@ -2037,7 +2038,7 @@ private NetworkStateTracker makeWimaxStateTracker() { // @see bug/4455071 /** Notify TetheringService if interface name has been changed. */ if (TextUtils.equals(mNetTrackers[netType].getNetworkInfo().getReason(), - Phone.REASON_LINK_PROPERTIES_CHANGED)) { + PhoneConstants.REASON_LINK_PROPERTIES_CHANGED)) { if (isTetheringSupported()) { mTethering.handleTetherIfaceChange(); } @@ -2489,6 +2490,11 @@ private NetworkStateTracker makeWimaxStateTracker() { // @see bug/4455071 handleConnectivityChange(info.getType(), false); break; + case NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED: + info = (NetworkInfo) msg.obj; + type = info.getType(); + updateNetworkSettings(mNetTrackers[type]); + break; case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: String causedBy = null; synchronized (ConnectivityService.this) { diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index 7609613..ea19d6e 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -1691,6 +1691,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Note: we can only do the wipe via ExternalStorageFormatter if the volume is not emulated. if ((forceExtWipe || wipeExtRequested) && !Environment.isExternalStorageEmulated()) { Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET); + intent.putExtra(ExternalStorageFormatter.EXTRA_ALWAYS_RESET, true); intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME); mWakeLock.acquire(10000); mContext.startService(intent); diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 1482d22..04267a3 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -1221,6 +1221,7 @@ class MountService extends IMountService.Stub for(MountServiceBinderListener bl : mListeners) { if (bl.mListener == listener) { mListeners.remove(mListeners.indexOf(bl)); + listener.asBinder().unlinkToDeath(bl, 0); return; } } diff --git a/services/java/com/android/server/NsdService.java b/services/java/com/android/server/NsdService.java index 6ad8bd0..87843d9 100644 --- a/services/java/com/android/server/NsdService.java +++ b/services/java/com/android/server/NsdService.java @@ -110,8 +110,8 @@ public class NsdService extends INsdManager.Stub { private final EnabledState mEnabledState = new EnabledState(); @Override - protected String getMessageInfo(Message msg) { - return cmdToString(msg.what); + protected String getWhatToString(int what) { + return cmdToString(what); } /** @@ -144,7 +144,7 @@ public class NsdService extends INsdManager.Stub { } else { setInitialState(mDisabledState); } - setProcessedMessagesSize(25); + setLogRecSize(25); registerForNsdSetting(); } diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 24c59a5..888ec69 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -1165,6 +1165,8 @@ public class PowerManagerService extends IPowerManager.Stub ? "SCREEN_BRIGHT_BIT " : "") + (((state & SCREEN_ON_BIT) != 0) ? "SCREEN_ON_BIT " : "") + + (((state & BUTTON_BRIGHT_BIT) != 0) + ? "BUTTON_BRIGHT_BIT " : "") + (((state & BATTERY_LOW_BIT) != 0) ? "BATTERY_LOW_BIT " : ""); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 6d0b26f..e55e7fe 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -83,7 +83,7 @@ class ServerThread extends Thread { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis()); - Looper.prepare(); + Looper.prepareMainLooper(); android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java index 1b1638a..c23a1d9 100644 --- a/services/java/com/android/server/TelephonyRegistry.java +++ b/services/java/com/android/server/TelephonyRegistry.java @@ -44,6 +44,7 @@ import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.DefaultPhoneNotifier; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.TelephonyIntents; import com.android.server.am.BatteryStatsService; @@ -622,7 +623,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED); - intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertCallState(state).toString()); + intent.putExtra(PhoneConstants.STATE_KEY, + DefaultPhoneNotifier.convertCallState(state).toString()); if (!TextUtils.isEmpty(incomingNumber)) { intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber); } @@ -637,34 +639,35 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { // status bar takes care of that after taking into account all of the // required info. Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); - intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertDataState(state).toString()); + intent.putExtra(PhoneConstants.STATE_KEY, + DefaultPhoneNotifier.convertDataState(state).toString()); if (!isDataConnectivityPossible) { - intent.putExtra(Phone.NETWORK_UNAVAILABLE_KEY, true); + intent.putExtra(PhoneConstants.NETWORK_UNAVAILABLE_KEY, true); } if (reason != null) { - intent.putExtra(Phone.STATE_CHANGE_REASON_KEY, reason); + intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, reason); } if (linkProperties != null) { - intent.putExtra(Phone.DATA_LINK_PROPERTIES_KEY, linkProperties); + intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties); String iface = linkProperties.getInterfaceName(); if (iface != null) { - intent.putExtra(Phone.DATA_IFACE_NAME_KEY, iface); + intent.putExtra(PhoneConstants.DATA_IFACE_NAME_KEY, iface); } } if (linkCapabilities != null) { - intent.putExtra(Phone.DATA_LINK_CAPABILITIES_KEY, linkCapabilities); + intent.putExtra(PhoneConstants.DATA_LINK_CAPABILITIES_KEY, linkCapabilities); } - if (roaming) intent.putExtra(Phone.DATA_NETWORK_ROAMING_KEY, true); + if (roaming) intent.putExtra(PhoneConstants.DATA_NETWORK_ROAMING_KEY, true); - intent.putExtra(Phone.DATA_APN_KEY, apn); - intent.putExtra(Phone.DATA_APN_TYPE_KEY, apnType); + intent.putExtra(PhoneConstants.DATA_APN_KEY, apn); + intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); mContext.sendStickyBroadcast(intent); } private void broadcastDataConnectionFailed(String reason, String apnType) { Intent intent = new Intent(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED); - intent.putExtra(Phone.FAILURE_REASON_KEY, reason); - intent.putExtra(Phone.DATA_APN_TYPE_KEY, apnType); + intent.putExtra(PhoneConstants.FAILURE_REASON_KEY, reason); + intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); mContext.sendStickyBroadcast(intent); } diff --git a/services/java/com/android/server/VibratorService.java b/services/java/com/android/server/VibratorService.java index b609867..72fde11 100755 --- a/services/java/com/android/server/VibratorService.java +++ b/services/java/com/android/server/VibratorService.java @@ -441,7 +441,7 @@ public class VibratorService extends IVibratorService.Stub private void delay(long duration) { if (duration > 0) { - long bedtime = SystemClock.uptimeMillis(); + long bedtime = duration + SystemClock.uptimeMillis(); do { try { this.wait(duration); @@ -451,8 +451,7 @@ public class VibratorService extends IVibratorService.Stub if (mDone) { break; } - duration = duration - - SystemClock.uptimeMillis() - bedtime; + duration = bedtime - SystemClock.uptimeMillis(); } while (duration > 0); } } diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index d97d335..8a08277 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -45,6 +45,7 @@ import android.os.RemoteException; import android.os.FileObserver; import android.os.ParcelFileDescriptor; import android.os.RemoteCallbackList; +import android.os.SELinux; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserId; @@ -639,8 +640,12 @@ class WallpaperManagerService extends IWallpaperManager.Stub { FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, -1, -1); } - ParcelFileDescriptor fd = ParcelFileDescriptor.open(new File(dir, WALLPAPER), + File file = new File(dir, WALLPAPER); + ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, MODE_CREATE|MODE_READ_WRITE); + if (!SELinux.restorecon(file)) { + return null; + } wallpaper.name = name; return fd; } catch (FileNotFoundException e) { diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index c239382..c14e2f6 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -25,6 +25,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Build; import android.os.Debug; import android.os.Handler; import android.os.Message; @@ -38,6 +39,8 @@ import android.util.Log; import android.util.Slog; import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; @@ -428,11 +431,10 @@ public class Watchdog extends Thread { } // If we got here, that means that the system is most likely hung. - // First collect stack traces from all threads of the system process. - // Then kill this process so that the system will restart. final String name = (mCurrentMonitor != null) ? mCurrentMonitor.getClass().getName() : "null"; + Slog.w(TAG, "WATCHDOG PROBLEM IN SYSTEM SERVER: " + name); EventLog.writeEvent(EventLogTags.WATCHDOG, name); ArrayList<Integer> pids = new ArrayList<Integer>(); @@ -467,11 +469,15 @@ public class Watchdog extends Thread { dropboxThread.join(2000); // wait up to 2 seconds for it to return. } catch (InterruptedException ignored) {} - // Only kill the process if the debugger is not attached. + // Only kill/crash the process if the debugger is not attached. if (!Debug.isDebuggerConnected()) { Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name); - Process.killProcess(Process.myPid()); - System.exit(10); + if (!Build.TYPE.equals("user")) { + forceCrashDump(); + } else { + Process.killProcess(Process.myPid()); + System.exit(10); + } } else { Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process"); } @@ -480,6 +486,50 @@ public class Watchdog extends Thread { } } + private void forceCrashDump() { + /* Sync file system to flash the data which is written just before the + * crash. + */ + java.lang.Process p = null; + try { + p = Runtime.getRuntime().exec("sync"); + if (p != null) { + // It is not necessary to check the exit code, here. + // 'sync' command always succeeds, and this function returns 0. + p.waitFor(); + } else { + Slog.e(TAG, "Failed to execute 'sync' command. (no process handle)"); + } + } catch (Exception e) { + // This code is an emergency path to crash MUT. The system already + // caused fatal error, and then calls this function to create a + // crash dump. This function must run the code below to force a + // crash, even if the sync command failed. + // Therefore, ignore all exceptions, here. + Slog.e(TAG, "Failed to execute 'sync' command prior to forcing crash: " + e); + } finally { + if (p != null) { + p.destroy(); + } + } + + FileWriter out = null; + try { + out = new FileWriter("/proc/sysrq-trigger"); + out.write("c"); + } catch (IOException e) { + Slog.e(TAG, "Failed to write to sysrq-trigger while triggering crash: " + e); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + Slog.e(TAG, "Failed to close sysrq-trigger while triggering crash: " + e); + } + } + } + } + private File dumpKernelStackTraces() { String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null); if (tracesPath == null || tracesPath.length() == 0) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 95d3c41..73deef0 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -106,6 +106,7 @@ import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.os.SELinux; import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; @@ -1820,7 +1821,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (cr.binding != null && cr.binding.service != null && cr.binding.service.app != null && cr.binding.service.app.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cr.binding.service.app, oomAdj, + updateLruProcessInternalLocked(cr.binding.service.app, false, updateActivityTime, i+1); } } @@ -1828,7 +1829,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int j=app.conProviders.size()-1; j>=0; j--) { ContentProviderRecord cpr = app.conProviders.get(j).provider; if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cpr.proc, oomAdj, + updateLruProcessInternalLocked(cpr.proc, false, updateActivityTime, i+1); } } @@ -2053,7 +2054,7 @@ public final class ActivityManagerService extends ActivityManagerNative // the PID of the new process, or else throw a RuntimeException. Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread", app.processName, uid, uid, gids, debugFlags, - app.info.targetSdkVersion, null); + app.info.targetSdkVersion, null, null); BatteryStatsImpl bs = app.batteryStats.getBatteryStats(); synchronized (bs) { @@ -3032,7 +3033,12 @@ public final class ActivityManagerService extends ActivityManagerNative File tracesFile = new File(tracesPath); try { File tracesDir = tracesFile.getParentFile(); - if (!tracesDir.exists()) tracesFile.mkdirs(); + if (!tracesDir.exists()) { + tracesFile.mkdirs(); + if (!SELinux.restorecon(tracesDir)) { + return null; + } + } FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x if (clearTraces && tracesFile.exists()) tracesFile.delete(); @@ -3136,7 +3142,12 @@ public final class ActivityManagerService extends ActivityManagerNative final File tracesDir = tracesFile.getParentFile(); final File tracesTmp = new File(tracesDir, "__tmp__"); try { - if (!tracesDir.exists()) tracesFile.mkdirs(); + if (!tracesDir.exists()) { + tracesFile.mkdirs(); + if (!SELinux.restorecon(tracesDir.getPath())) { + return; + } + } FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x if (tracesFile.exists()) { diff --git a/services/java/com/android/server/am/DeviceMonitor.java b/services/java/com/android/server/am/DeviceMonitor.java index 5f3b0ce..21e7252 100644 --- a/services/java/com/android/server/am/DeviceMonitor.java +++ b/services/java/com/android/server/am/DeviceMonitor.java @@ -16,6 +16,7 @@ package com.android.server.am; +import android.os.SELinux; import android.util.Slog; import java.io.*; @@ -80,6 +81,9 @@ class DeviceMonitor { if (!BASE.isDirectory() && !BASE.mkdirs()) { throw new AssertionError("Couldn't create " + BASE + "."); } + if (!SELinux.restorecon(BASE)) { + throw new AssertionError("Couldn't restorecon " + BASE + "."); + } } private static final File[] PATHS = { diff --git a/services/java/com/android/server/am/ProviderMap.java b/services/java/com/android/server/am/ProviderMap.java index d148ec3..e4608a2 100644 --- a/services/java/com/android/server/am/ProviderMap.java +++ b/services/java/com/android/server/am/ProviderMap.java @@ -127,7 +127,12 @@ public class ProviderMap { Slog.i(TAG, "Removing from providersByName name=" + name + " user=" + (optionalUserId == -1 ? Binder.getOrigCallingUser() : optionalUserId)); - getProvidersByName(optionalUserId).remove(name); + HashMap<String, ContentProviderRecord> map = getProvidersByName(optionalUserId); + // map returned by getProvidersByName wouldn't be null + map.remove(name); + if (map.size() == 0) { + mProvidersByNamePerUser.remove(optionalUserId); + } } } @@ -141,7 +146,12 @@ public class ProviderMap { Slog.i(TAG, "Removing from providersByClass name=" + name + " user=" + (optionalUserId == -1 ? Binder.getOrigCallingUser() : optionalUserId)); - getProvidersByClass(optionalUserId).remove(name); + HashMap<ComponentName, ContentProviderRecord> map = getProvidersByClass(optionalUserId); + // map returned by getProvidersByClass wouldn't be null + map.remove(name); + if (map.size() == 0) { + mProvidersByClassPerUser.remove(optionalUserId); + } } } diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 88a0ccb..682ecf8 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -47,6 +47,7 @@ import android.provider.Settings; import android.util.Log; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.IState; import com.android.internal.util.State; import com.android.internal.util.StateMachine; @@ -1190,7 +1191,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { boolean retValue = true; if (apnType == ConnectivityManager.TYPE_NONE) return false; if (apnType != mMobileApnReserved) turnOffUpstreamMobileConnection(); - int result = Phone.APN_REQUEST_FAILED; + int result = PhoneConstants.APN_REQUEST_FAILED; String enableString = enableString(apnType); if (enableString == null) return false; try { @@ -1199,14 +1200,14 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } catch (Exception e) { } switch (result) { - case Phone.APN_ALREADY_ACTIVE: - case Phone.APN_REQUEST_STARTED: + case PhoneConstants.APN_ALREADY_ACTIVE: + case PhoneConstants.APN_REQUEST_STARTED: mMobileApnReserved = apnType; Message m = obtainMessage(CMD_CELL_CONNECTION_RENEW); m.arg1 = ++mCurrentConnectionSequence; sendMessageDelayed(m, CELL_CONNECTION_RENEW_MS); break; - case Phone.APN_REQUEST_FAILED: + case PhoneConstants.APN_REQUEST_FAILED: default: retValue = false; break; diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java index ce53499..4ad6140 100755 --- a/services/java/com/android/server/location/GpsLocationProvider.java +++ b/services/java/com/android/server/location/GpsLocationProvider.java @@ -60,6 +60,7 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import java.io.File; import java.io.FileInputStream; @@ -1285,8 +1286,8 @@ public class GpsLocationProvider implements LocationProviderInterface { int result = mConnMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL); mAGpsDataConnectionIpAddr = ipaddr; - if (result == Phone.APN_ALREADY_ACTIVE) { - if (DEBUG) Log.d(TAG, "Phone.APN_ALREADY_ACTIVE"); + if (result == PhoneConstants.APN_ALREADY_ACTIVE) { + if (DEBUG) Log.d(TAG, "PhoneConstants.APN_ALREADY_ACTIVE"); if (mAGpsApn != null) { Log.d(TAG, "mAGpsDataConnectionIpAddr " + mAGpsDataConnectionIpAddr); if (mAGpsDataConnectionIpAddr != 0xffffffff) { @@ -1300,12 +1301,12 @@ public class GpsLocationProvider implements LocationProviderInterface { native_agps_data_conn_open(mAGpsApn); mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; } else { - Log.e(TAG, "mAGpsApn not set when receiving Phone.APN_ALREADY_ACTIVE"); + Log.e(TAG, "mAGpsApn not set when receiving PhoneConstants.APN_ALREADY_ACTIVE"); mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } - } else if (result == Phone.APN_REQUEST_STARTED) { - if (DEBUG) Log.d(TAG, "Phone.APN_REQUEST_STARTED"); + } else if (result == PhoneConstants.APN_REQUEST_STARTED) { + if (DEBUG) Log.d(TAG, "PhoneConstants.APN_REQUEST_STARTED"); // Nothing to do here } else { if (DEBUG) Log.d(TAG, "startUsingNetworkFeature failed"); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 75b3f04..f914271 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -96,6 +96,7 @@ import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; +import android.os.SELinux; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; @@ -143,6 +144,7 @@ import java.util.Set; import libcore.io.ErrnoException; import libcore.io.IoUtils; import libcore.io.Libcore; +import libcore.io.StructStat; /** * Keep track of all those .apks everywhere. @@ -293,8 +295,6 @@ public class PackageManagerService extends IPackageManager.Stub { File mScanningPath; int mLastScanError; - final int[] mOutPermissions = new int[3]; - // ---------------------------------------------------------------- // Keys are String (package name), values are Package. This also serves @@ -3761,14 +3761,18 @@ public class PackageManagerService extends IPackageManager.Stub { boolean uidError = false; if (dataPath.exists()) { - // XXX should really do this check for each user. - mOutPermissions[1] = 0; - FileUtils.getPermissions(dataPath.getPath(), mOutPermissions); + int currentUid = 0; + try { + StructStat stat = Libcore.os.stat(dataPath.getPath()); + currentUid = stat.st_uid; + } catch (ErrnoException e) { + Slog.e(TAG, "Couldn't stat path " + dataPath.getPath(), e); + } // If we have mismatched owners for the data path, we have a problem. - if (mOutPermissions[1] != pkg.applicationInfo.uid) { + if (currentUid != pkg.applicationInfo.uid) { boolean recovered = false; - if (mOutPermissions[1] == 0) { + if (currentUid == 0) { // The directory somehow became owned by root. Wow. // This is probably because the system was stopped while // installd was in the middle of messing with its libs @@ -3797,7 +3801,7 @@ public class PackageManagerService extends IPackageManager.Stub { ? "System package " : "Third party package "; String msg = prefix + pkg.packageName + " has changed from uid: " - + mOutPermissions[1] + " to " + + currentUid + " to " + pkg.applicationInfo.uid + "; old data erased"; reportSettingsProblem(Log.WARN, msg); recovered = true; @@ -3829,11 +3833,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (!recovered) { pkg.applicationInfo.dataDir = "/mismatched_uid/settings_" + pkg.applicationInfo.uid + "/fs_" - + mOutPermissions[1]; + + currentUid; pkg.applicationInfo.nativeLibraryDir = pkg.applicationInfo.dataDir; String msg = "Package " + pkg.packageName + " has mismatched uid: " - + mOutPermissions[1] + " on disk, " + + currentUid + " on disk, " + pkg.applicationInfo.uid + " in settings"; // writer synchronized (mPackages) { @@ -6418,6 +6422,10 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } + if (!SELinux.restorecon(newCodeFile)) { + return false; + } + return true; } } @@ -7399,6 +7407,9 @@ public class PackageManagerService extends IPackageManager.Stub { FileUtils.setPermissions( tmpPackageFile.getCanonicalPath(), FileUtils.S_IRUSR|FileUtils.S_IWUSR, -1, -1); + if (!SELinux.restorecon(tmpPackageFile)) { + return null; + } } catch (IOException e) { Slog.e(TAG, "Trouble getting the canoncical path for a temp file."); return null; diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index d031686..120b650 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -1241,7 +1241,7 @@ final class Settings { // Avoid any application that has a space in its path // or that is handled by the system. - if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID) + if (dataPath.indexOf(" ") >= 0 || ai.uid < Process.FIRST_APPLICATION_UID) continue; // we store on each line the following information for now: diff --git a/services/java/com/android/server/pm/ShutdownThread.java b/services/java/com/android/server/pm/ShutdownThread.java index 69406c8..3675d41 100644 --- a/services/java/com/android/server/pm/ShutdownThread.java +++ b/services/java/com/android/server/pm/ShutdownThread.java @@ -84,6 +84,8 @@ public final class ShutdownThread extends Thread { private PowerManager.WakeLock mCpuWakeLock; private PowerManager.WakeLock mScreenWakeLock; private Handler mHandler; + + private static AlertDialog sConfirmDialog; private ShutdownThread() { } @@ -124,7 +126,10 @@ public final class ShutdownThread extends Thread { if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); - final AlertDialog dialog = new AlertDialog.Builder(context) + if (sConfirmDialog != null) { + sConfirmDialog.dismiss(); + } + sConfirmDialog = new AlertDialog.Builder(context) .setTitle(mRebootSafeMode ? com.android.internal.R.string.reboot_safemode_title : com.android.internal.R.string.power_off) @@ -136,10 +141,10 @@ public final class ShutdownThread extends Thread { }) .setNegativeButton(com.android.internal.R.string.no, null) .create(); - closer.dialog = dialog; - dialog.setOnDismissListener(closer); - dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); - dialog.show(); + closer.dialog = sConfirmDialog; + sConfirmDialog.setOnDismissListener(closer); + sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + sConfirmDialog.show(); } else { beginShutdownSequence(context); } diff --git a/services/java/com/android/server/usb/UsbSettingsManager.java b/services/java/com/android/server/usb/UsbSettingsManager.java index 7dde340..9b3459b 100644 --- a/services/java/com/android/server/usb/UsbSettingsManager.java +++ b/services/java/com/android/server/usb/UsbSettingsManager.java @@ -545,6 +545,10 @@ class UsbSettingsManager { defaultPackage = mDevicePreferenceMap.get(new DeviceFilter(device)); } + // Send broadcast to running activity with registered intent + mContext.sendBroadcast(intent); + + // Start activity with registered intent resolveActivity(intent, matches, defaultPackage, device, null); } |
