diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-11-23 14:44:26 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-11-23 14:53:06 +0100 |
commit | cddefa2d1513e96673fcaba8984517caa0d7601d (patch) | |
tree | cbf8baf65f0e5c64e8b8e484be7e16b9c2a3aad1 /src/technology.c | |
parent | 0dca8e04b91eed41c0dc77bc63145f1682546b11 (diff) | |
download | connman-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.c | 11 |
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); |