Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 19 May 2016 21:06:34 +0000
From:      Raviprakash Darbha <rdarbha@juniper.net>
To:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>, "andre@freebsd.org" <andre@freebsd.org>
Cc:        Raviprakash Darbha <rdarbha@juniper.net>, Steve Kiernan <stevek@juniper.net>
Subject:   Double lock issue of unp_link_rwlock in usrreq.c observed 
Message-ID:  <948AD75B-BF6E-4672-8B50-9CF9E25667EA@juniper.net>

next in thread | raw e-mail | index | archive | help

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@juniper.net<mailto:rdarbha@juniper.net>





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?948AD75B-BF6E-4672-8B50-9CF9E25667EA>