summaryrefslogtreecommitdiff
path: root/src/technology.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-11-23 14:44:26 +0100
committerSamuel Ortiz <sameo@linux.intel.com>2010-11-23 14:53:06 +0100
commitcddefa2d1513e96673fcaba8984517caa0d7601d (patch)
treecbf8baf65f0e5c64e8b8e484be7e16b9c2a3aad1 /src/technology.c
parent0dca8e04b91eed41c0dc77bc63145f1682546b11 (diff)
downloadconnman-cddefa2d1513e96673fcaba8984517caa0d7601d.tar.gz
connman-cddefa2d1513e96673fcaba8984517caa0d7601d.tar.bz2
connman-cddefa2d1513e96673fcaba8984517caa0d7601d.zip
technology: Decrease blocked refcount when removing a blocked device
Fixes BMC#10330
Diffstat (limited to 'src/technology.c')
-rw-r--r--src/technology.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/technology.c b/src/technology.c
index b315e952..98fcf8dd 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -689,6 +689,8 @@ int __connman_technology_update_rfkill(unsigned int index,
int __connman_technology_remove_rfkill(unsigned int index)
{
struct connman_technology *technology;
+ struct connman_rfkill *rfkill;
+ connman_bool_t blocked;
DBG("index %u", index);
@@ -696,11 +698,18 @@ int __connman_technology_remove_rfkill(unsigned int index)
if (technology == NULL)
return -ENXIO;
+ rfkill = g_hash_table_lookup(technology->rfkill_list, &index);
+ if (rfkill == NULL)
+ return -ENXIO;
+
+ blocked = (rfkill->softblock || rfkill->hardblock) ? TRUE : FALSE;
+
g_hash_table_remove(technology->rfkill_list, &index);
g_hash_table_remove(rfkill_table, &index);
- if (g_atomic_int_dec_and_test(&technology->blocked) == TRUE) {
+ if (blocked &&
+ g_atomic_int_dec_and_test(&technology->blocked) == TRUE) {
technology_blocked(technology, FALSE);
technology->state = CONNMAN_TECHNOLOGY_STATE_AVAILABLE;
state_changed(technology);