summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-10-22 09:01:12 -0600
committerLinux Build Service Account <lnxbuild@localhost>2016-10-22 09:01:12 -0600
commitefada0548275ff7702450a74b5f9fc429190fc51 (patch)
treedf469e7951c3ce93b73544fc6a2a99512deac5f5
parenta79302cf6f3f0c8d6469e6ee0752e404ad205077 (diff)
parent1d22bfc5c74c76a67b1064204be1d1222312a303 (diff)
downloadandroid_packages_providers_TelephonyProvider-efada0548275ff7702450a74b5f9fc429190fc51.tar.gz
android_packages_providers_TelephonyProvider-efada0548275ff7702450a74b5f9fc429190fc51.tar.bz2
android_packages_providers_TelephonyProvider-efada0548275ff7702450a74b5f9fc429190fc51.zip
Merge 1d22bfc5c74c76a67b1064204be1d1222312a303 on remote branch
Change-Id: I226c8b118251d4c78022429854644f43b9a6a8fd
-rwxr-xr-xsrc/com/android/providers/telephony/MmsProvider.java37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/com/android/providers/telephony/MmsProvider.java b/src/com/android/providers/telephony/MmsProvider.java
index def145e..79791fa 100755
--- a/src/com/android/providers/telephony/MmsProvider.java
+++ b/src/com/android/providers/telephony/MmsProvider.java
@@ -16,6 +16,7 @@
package com.android.providers.telephony;
+import android.annotation.NonNull;
import android.app.AppOpsManager;
import android.content.ContentProvider;
import android.content.ContentUris;
@@ -496,7 +497,11 @@ public class MmsProvider extends ContentProvider {
@Override
public Uri insert(Uri uri, ContentValues values) {
- // Don't let anyone insert anything with the _data column
+ // The _data column is filled internally in MmsProvider, so this check is just to avoid
+ // it from being inadvertently set. This is not supposed to be a protection against
+ // malicious attack, since sql injection could still be attempted to bypass the check. On
+ // the other hand, the MmsProvider does verify that the _data column has an allowed value
+ // before opening any uri/files.
if (values != null && values.containsKey(Part._DATA)) {
return null;
}
@@ -951,9 +956,12 @@ public class MmsProvider extends ContentProvider {
}
@Override
- public int update(Uri uri, ContentValues values,
- String selection, String[] selectionArgs) {
- // Don't let anyone update the _data column
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ // The _data column is filled internally in MmsProvider, so this check is just to avoid
+ // it from being inadvertently set. This is not supposed to be a protection against
+ // malicious attack, since sql injection could still be attempted to bypass the check. On
+ // the other hand, the MmsProvider does verify that the _data column has an allowed value
+ // before opening any uri/files.
if (values != null && values.containsKey(Part._DATA)) {
return 0;
}
@@ -1059,7 +1067,12 @@ public class MmsProvider extends ContentProvider {
return null;
}
- // Verify that the _data path points to mms data
+ return safeOpenFileHelper(uri, mode);
+ }
+
+ @NonNull
+ private ParcelFileDescriptor safeOpenFileHelper(
+ @NonNull Uri uri, @NonNull String mode) throws FileNotFoundException {
Cursor c = query(uri, new String[]{"_data"}, null, null, null);
int count = (c != null) ? c.getCount() : 0;
if (count != 1) {
@@ -1080,10 +1093,16 @@ public class MmsProvider extends ContentProvider {
c.close();
if (path == null) {
- return null;
+ throw new FileNotFoundException("Column _data not found.");
}
+
+ File filePath = new File(path);
try {
- File filePath = new File(path);
+ // The MmsProvider shouldn't open a file that isn't MMS data, so we verify that the
+ // _data path actually points to MMS data. That safeguards ourselves from callers who
+ // inserted or updated a URI (more specifically the _data column) with disallowed paths.
+ // TODO(afurtado): provide a more robust mechanism to avoid disallowed _data paths to
+ // be inserted/updated in the first place, including via SQL injection.
if (!filePath.getCanonicalPath()
.startsWith(getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath())) {
Log.e(TAG, "openFile: path "
@@ -1091,7 +1110,6 @@ public class MmsProvider extends ContentProvider {
+ " does not start with "
+ getContext().getDir(PARTS_DIR_NAME, 0).getCanonicalPath());
// Don't care return value
- filePath.delete();
return null;
}
} catch (IOException e) {
@@ -1099,7 +1117,8 @@ public class MmsProvider extends ContentProvider {
return null;
}
- return openFileHelper(uri, mode);
+ int modeBits = ParcelFileDescriptor.parseMode(mode);
+ return ParcelFileDescriptor.open(filePath, modeBits);
}
private void filterUnsupportedKeys(ContentValues values) {