0

android: use Cursor.getColumnIndexOrThrow.

Cursor.getColumnIndex returns -1 if the column is not found, which is an
invalid argument for the various Cursor.getType() functions.  Android 12
has a new lint rule enforcing that the arguments passed here are
non-negative.

Since we don't handle this case in any of these callsites which is
likely to throw an exception anyway, just use getColumnIndexOrThrow to
make it explicit that we expect the column to always exist and it's an
error if it doesn't.

Bug: 1223110
Change-Id: Ie0c2db499cf010ef97f16cd8f02c9fef29f662e2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3032292
Reviewed-by: Ted Choc <tedchoc@chromium.org>
Auto-Submit: Richard Coles <torne@chromium.org>
Commit-Queue: Richard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#902695}
This commit is contained in:
Torne (Richard Coles)
2021-07-16 22:03:17 +00:00
committed by Chromium LUCI CQ
parent 35916d2a4c
commit dc2925afd5
7 changed files with 42 additions and 38 deletions
android_webview/java/src/org/chromium/android_webview
chrome
android
browser
download
android
java
src
org
chromium
chrome
components
browser_ui
contacts_picker
android
java
src
org
chromium
components
browser_ui
download
internal
common
android
java
src
org
chromium

@ -210,8 +210,8 @@ public class HttpAuthDatabase {
new String[] { host, realm }, null, null, null);
if (cursor.moveToFirst()) {
ret = new String[] {
cursor.getString(cursor.getColumnIndex(HTTPAUTH_USERNAME_COL)),
cursor.getString(cursor.getColumnIndex(HTTPAUTH_PASSWORD_COL)),
cursor.getString(cursor.getColumnIndexOrThrow(HTTPAUTH_USERNAME_COL)),
cursor.getString(cursor.getColumnIndexOrThrow(HTTPAUTH_PASSWORD_COL)),
};
}
} catch (IllegalStateException e) {

@ -791,7 +791,7 @@ public class DownloadManagerService implements DownloadController.Observer,
uri, null, null, null, null)) {
if (cursor == null || cursor.getCount() == 0) return null;
cursor.moveToNext();
mimeType = cursor.getString(cursor.getColumnIndex(MediaColumns.MIME_TYPE));
mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaColumns.MIME_TYPE));
cursor.close();
}
}

@ -57,16 +57,16 @@ class ChromeBrowserProviderSuggestionsCursor extends AbstractCursor {
public String getString(int column) {
switch (column) {
case COLUMN_ID:
return mCursor.getString(mCursor.getColumnIndex(BookmarkColumns.ID));
return mCursor.getString(mCursor.getColumnIndexOrThrow(BookmarkColumns.ID));
case COLUMN_SUGGEST_INTENT_ACTION:
return Intent.ACTION_VIEW;
case COLUMN_SUGGEST_INTENT_DATA:
return mCursor.getString(mCursor.getColumnIndex(BookmarkColumns.URL));
return mCursor.getString(mCursor.getColumnIndexOrThrow(BookmarkColumns.URL));
case COLUMN_SUGGEST_TEXT_1:
return mCursor.getString(mCursor.getColumnIndex(BookmarkColumns.TITLE));
return mCursor.getString(mCursor.getColumnIndexOrThrow(BookmarkColumns.TITLE));
case COLUMN_SUGGEST_TEXT_2:
case COLUMN_SUGGEST_TEXT_2_URL:
return mCursor.getString(mCursor.getColumnIndex(BookmarkColumns.URL));
return mCursor.getString(mCursor.getColumnIndexOrThrow(BookmarkColumns.URL));
case COLUMN_SUGGEST_ICON_1:
// This is the icon displayed to the left of the result in QSB.
return Integer.toString(R.mipmap.app_icon);
@ -75,8 +75,8 @@ class ChromeBrowserProviderSuggestionsCursor extends AbstractCursor {
// time of 0 for all bookmarks. In the Android provider, this will yield a negative
// last access time. A negative last access time will cause global search to discard
// the result, so fix it up before we return it.
long lastAccess = mCursor.getLong(
mCursor.getColumnIndex(BookmarkColumns.DATE));
long lastAccess =
mCursor.getLong(mCursor.getColumnIndexOrThrow(BookmarkColumns.DATE));
return lastAccess < 0 ? "0" : "" + lastAccess;
default:
throw new UnsupportedOperationException();
@ -93,8 +93,8 @@ class ChromeBrowserProviderSuggestionsCursor extends AbstractCursor {
switch (c) {
case 7:
// See comments above in getString() re. negative last access times.
long lastAccess = mCursor.getLong(
mCursor.getColumnIndex(BookmarkColumns.DATE));
long lastAccess =
mCursor.getLong(mCursor.getColumnIndexOrThrow(BookmarkColumns.DATE));
return lastAccess < 0 ? 0 : lastAccess;
default:
throw new UnsupportedOperationException();

@ -74,8 +74,8 @@ public class WebApkShareTargetUtil {
try (Cursor cursor = ContextUtils.getApplicationContext().getContentResolver().query(
uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) {
String result =
cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
String result = cursor.getString(
cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME));
if (result != null) {
return result;
}

@ -169,17 +169,20 @@ public class DownloadManagerBridge {
}
result.downloadStatus = DownloadStatus.IN_PROGRESS;
if (c.moveToNext()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
result.downloadStatus = getDownloadStatus(status);
result.fileName = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
result.failureReason = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON));
result.lastModifiedTime =
c.getLong(c.getColumnIndex(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP));
result.bytesDownloaded =
c.getLong(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
result.fileName =
c.getString(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TITLE));
result.failureReason =
c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_REASON));
result.lastModifiedTime = c.getLong(
c.getColumnIndexOrThrow(DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP));
result.bytesDownloaded = c.getLong(
c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
result.bytesTotal =
c.getLong(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
String localUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
c.getLong(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
String localUri =
c.getString(c.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
if (!TextUtils.isEmpty(localUri)) {
Uri uri = Uri.parse(localUri);
result.filePath = uri.getPath();

@ -113,8 +113,8 @@ class ContactsFetcherWorkerTask extends AsyncTask<ArrayList<ContactDetails>> {
String key = "";
String value;
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(idColumn));
value = cursor.getString(cursor.getColumnIndex(dataColumn));
String id = cursor.getString(cursor.getColumnIndexOrThrow(idColumn));
value = cursor.getString(cursor.getColumnIndexOrThrow(dataColumn));
if (value == null) value = "";
if (key.isEmpty()) {
key = id;
@ -172,17 +172,17 @@ class ContactsFetcherWorkerTask extends AsyncTask<ArrayList<ContactDetails>> {
String key = "";
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(
String id = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID));
String city = cursor.getString(
cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String country = cursor.getString(cursor.getColumnIndex(
String city = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String country = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String formattedAddress = cursor.getString(cursor.getColumnIndex(
String formattedAddress = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
String postcode = cursor.getString(cursor.getColumnIndex(
String postcode = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String region = cursor.getString(cursor.getColumnIndex(
String region = cursor.getString(cursor.getColumnIndexOrThrow(
ContactsContract.CommonDataKinds.StructuredPostal.REGION));
PaymentAddress address =
createAddress(city, country, formattedAddress, postcode, region);
@ -240,9 +240,10 @@ class ContactsFetcherWorkerTask extends AsyncTask<ArrayList<ContactDetails>> {
ArrayList<ContactDetails> contacts = new ArrayList<ContactDetails>(cursor.getCount());
do {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String id =
cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String name = cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
List<String> email = mIncludeEmails ? emailMap.get(id) : null;
List<String> tel = mIncludeTel ? phoneMap.get(id) : null;
List<PaymentAddress> address = mIncludeAddresses ? addressMap.get(id) : null;

@ -190,7 +190,7 @@ public class DownloadCollectionBridge {
cursor = resolver.query(Uri.parse(intermediateUri),
new String[] {MediaColumns.MIME_TYPE}, null, null, null);
if (cursor != null && cursor.getCount() != 0 && cursor.moveToNext()) {
mimeType = cursor.getString(cursor.getColumnIndex(MediaColumns.MIME_TYPE));
mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaColumns.MIME_TYPE));
}
} catch (Exception e) {
Log.e(TAG, "Unable to get mimeType.", e);
@ -277,9 +277,9 @@ public class DownloadCollectionBridge {
List<DisplayNameInfo> infos = new ArrayList<DisplayNameInfo>();
while (cursor.moveToNext()) {
String displayName =
cursor.getString(cursor.getColumnIndex(MediaColumns.DISPLAY_NAME));
cursor.getString(cursor.getColumnIndexOrThrow(MediaColumns.DISPLAY_NAME));
Uri downloadUri = ContentUris.withAppendedId(
uri, cursor.getInt(cursor.getColumnIndex(BaseColumns._ID)));
uri, cursor.getInt(cursor.getColumnIndexOrThrow(BaseColumns._ID)));
infos.add(new DisplayNameInfo(downloadUri.toString(), displayName));
}
return infos.toArray(new DisplayNameInfo[0]);
@ -314,7 +314,7 @@ public class DownloadCollectionBridge {
if (cursor == null) return null;
if (cursor.moveToNext()) {
return ContentUris.withAppendedId(
uri, cursor.getInt(cursor.getColumnIndex(BaseColumns._ID)));
uri, cursor.getInt(cursor.getColumnIndexOrThrow(BaseColumns._ID)));
}
} catch (Exception e) {
Log.e(TAG, "Unable to check file name existence.", e);
@ -428,7 +428,7 @@ public class DownloadCollectionBridge {
new String[] {MediaColumns.DISPLAY_NAME}, null, null, null);
if (cursor == null || cursor.getCount() == 0) return null;
if (cursor.moveToNext()) {
return cursor.getString(cursor.getColumnIndex(MediaColumns.DISPLAY_NAME));
return cursor.getString(cursor.getColumnIndexOrThrow(MediaColumns.DISPLAY_NAME));
}
} catch (Exception e) {
Log.e(TAG, "Unable to get display name for download.", e);