diff options
author | chao.bi <chao.bi@intel.com> | 2016-03-16 00:12:24 +0800 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2016-04-14 00:49:56 -0700 |
commit | 7a8a51b231b4aea8dd9db1b7aece3d71c875d731 (patch) | |
tree | d4d9c250cc51b67c260e0ed00a268935a51d21a7 /packages/WAPPushManager | |
parent | 15e7a21560764d644673854894eefbcd759d420a (diff) | |
download | frameworks_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.java | 7 |
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; } |