summaryrefslogtreecommitdiffstats
path: root/packages/WAPPushManager
diff options
context:
space:
mode:
authorchao.bi <chao.bi@intel.com>2016-03-16 00:12:24 +0800
committerSteve Kondik <shade@chemlab.org>2016-04-14 00:49:56 -0700
commit7a8a51b231b4aea8dd9db1b7aece3d71c875d731 (patch)
treed4d9c250cc51b67c260e0ed00a268935a51d21a7 /packages/WAPPushManager
parent15e7a21560764d644673854894eefbcd759d420a (diff)
downloadframeworks_base-7a8a51b231b4aea8dd9db1b7aece3d71c875d731.zip
frameworks_base-7a8a51b231b4aea8dd9db1b7aece3d71c875d731.tar.gz
frameworks_base-7a8a51b231b4aea8dd9db1b7aece3d71c875d731.tar.bz2
Race in WapPushManager under multi-thread environment
When multiple threads call WapPushManager functions simultaneously, it might hit race that one thread is closing a SqliteDatabase object while another thread is using it. Following is an example: Thread A Thread B call getDatabaseLocked() --- | | mDatabase is NULL,so A create Database --- | | getDatabaseLocked() return the new --- created Database --- | | --- call getDatabaseLocked() and return --- the Database created by A | | Call SQLiteDatabase.close() --- close() -> releaseReference() --- the reference count is decreased to 0 --- | | --- Attempt to call any operation of Database --- Object, but hit exception because this --- Database Object's reference count is 0 For WapPushManager, seems it always close the database object right after it open&query it, this is not necessary and would hit above race under multi-thread environment. Change-Id: I68fac046f806c8d9328fbe0d9c8a08e6bfddbef1 Signed-off-by: wangbo3 <bo.c.wang@intel.com> Signed-off-by: chao.bi <chao.bi@intel.com> Signed-off-by: Zhiquan Liu <zhiquan.liu@intel.com>
Diffstat (limited to 'packages/WAPPushManager')
-rw-r--r--packages/WAPPushManager/src/com/android/smspush/WapPushManager.java7
1 files changed, 0 insertions, 7 deletions
diff --git a/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java b/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
index e970367..96d29fd 100644
--- a/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
+++ b/packages/WAPPushManager/src/com/android/smspush/WapPushManager.java
@@ -185,7 +185,6 @@ public class WapPushManager extends Service {
WapPushManDBHelper dbh = getDatabase(mContext);
SQLiteDatabase db = dbh.getReadableDatabase();
WapPushManDBHelper.queryData lastapp = dbh.queryLastApp(db, app_id, content_type);
- db.close();
if (lastapp == null) {
Log.w(LOG_TAG, "no receiver app found for " + app_id + ":" + content_type);
@@ -284,7 +283,6 @@ public class WapPushManager extends Service {
ret = true;
}
- db.close();
return ret;
}
@@ -308,7 +306,6 @@ public class WapPushManager extends Service {
WapPushManDBHelper.queryData lastapp = dbh.queryLastApp(db, x_app_id, content_type);
if (lastapp == null) {
- db.close();
return false;
}
@@ -328,7 +325,6 @@ public class WapPushManager extends Service {
+ package_name + "." + class_name
+ ", sq:" + lastapp.installOrder);
- db.close();
return num > 0;
}
@@ -346,7 +342,6 @@ public class WapPushManager extends Service {
+ " and class_name=\'" + class_name + "\'";
int num_removed = db.delete(APPID_TABLE_NAME, where, null);
- db.close();
if (LOCAL_LOGV) Log.v(LOG_TAG, "deleted " + num_removed + " rows:"
+ x_app_id + ":" + content_type + " "
+ package_name + "." + class_name);
@@ -399,7 +394,6 @@ public class WapPushManager extends Service {
if (LOCAL_LOGV) Log.v(LOG_TAG, "verifyData app id: " + x_app_id + " content type: " +
content_type + " lastapp: " + lastapp);
- db.close();
if (lastapp == null) return false;
@@ -430,7 +424,6 @@ public class WapPushManager extends Service {
SQLiteDatabase db = dbh.getReadableDatabase();
boolean ret = dbh.queryLastApp(db, x_app_id, content_type) != null;
- db.close();
return ret;
}