dahdi: Protect echocan creation/destruction with mutex.
authorShaun Ruffell <sruffell@digium.com>
Thu, 19 Jun 2014 21:40:01 +0000 (16:40 -0500)
committerRuss Meyerriecks <rmeyerriecks@digium.com>
Fri, 20 Jun 2014 18:01:27 +0000 (13:01 -0500)
commit761e02da5267f1d6a516469b240da2b37f871c88
tree37021ab9fd17d436d0d0fb1585d6c2fec0294143
parentcb50ae150040465faa5e6e57e32ba8d8b6de3947
dahdi: Protect echocan creation/destruction with mutex.

This closes a reference and memory leak when multiple CPUs are enabling echocan
on a single channel in parallel.

The essential problem is that the call to try_module_get() is not serialized.
Two separate threads can come into ioctl_echocan() on the same channel, they
coordinate via the dahdi_chan.lock to release any current echocan, but then both
create a new echocan state, bump the reference on the module, and the last one
through will actually attach the new state to the channel. The earlier reference
/ memory is leaked.

I tried to conceive of a way to fix this leak without adding a new lock, but the
choices where calling throught the function pointers with dahdi_chan.lock.
Otherwise I needed to change the semantics of echocan_create /free which would
ripple through the hardware echocan modules.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
drivers/dahdi/dahdi-base.c
include/dahdi/kernel.h