__sync_fetch_and_sub() gives the value that had previously been in memory
which gives the older refount.
technology_find() does not refcount the technology.
__connman_technology_update_rfkill() was using technology_get() which
was refcounting the technology. Every technology_get() must be matched
with a corresponding technology_put() for accurate refcounting.
{
DBG("technology %p", technology);
- if (__sync_fetch_and_sub(&technology->refcount, 1) > 0)
+ if (__sync_sub_and_fetch(&technology->refcount, 1) > 0)
return;
reply_scan_pending(technology, -EINTR);
return 0;
}
- technology = technology_get(type);
+ technology = technology_find(type);
/* If there is no driver for this type, ignore it. */
if (technology == NULL)
return -ENXIO;