Double lock issue of unp_link_rwlock in usrreq.c observed

Raviprakash Darbha rdarbha at juniper.net
Thu May 19 21:06:43 UTC 2016


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