Double lock issue of unp_link_rwlock in usrreq.c observed
Raviprakash Darbha
rdarbha at juniper.net
Sat Jun 11 21:09:15 UTC 2016
Resending the Mail, if anyone has looked at it.
Thanks
RaviPrakash Darbha
rdarbha at juniper.net<mailto:rdarbha at juniper.net>
On May 19, 2016, at 2:06 PM, RaviPrakash Darbha <rdarbha at juniper.net<mailto:rdarbha at juniper.net>> wrote:
Hello Andre
I encountered a double lock issue in unp_connectat function. After looking at the code , I think the unp_link_rwlock is being locked once unp_connectat and once again in unp_detach (called from sofree ). Would like to get your opinion on the issue and the fix. Below is the exact call stack.
UNP_LINK_WLOCK(); <—————————— 1 st call
…..
…..
if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
if (so2->so_options & SO_ACCEPTCONN
CURVNET_SET(so2->so_vnet);
so3 = sonewconn(so2, 0);
// Expanding sonewconn
{
sonewconn
{
……
soalloc
…….
pru_attach
…….
if (!(head->so_options & SO_ACCEPTCONN) &&
((head->so_proto->pr_protocol != IPPROTO_SCTP) ||
(head->so_type != SOCK_SEQPACKET))) {
……….
sofree(so); /* NB: returns ACCEPT_UNLOCK'ed. */
// Expanding sofree
{
…….
pru_detach
// expanding pru_detach
{
// Recursive wlock acquiring.
UNP_LINK_WLOCK() <—————————— 2nd Call
Let me know your thoughts or if you need more information. Thanks !
Thanks
RaviPrakash Darbha
rdarbha at juniper.net<mailto:rdarbha at juniper.net>
More information about the freebsd-net
mailing list