Print this page
3354 kernel crash in rpcsec_gss after using gsscred
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Carlos Neira <cneirabustos@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
NEX-4123 xdrmblk_getpos() is unreliable
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
re #13613 rb4516 Tunables needs volatile keyword
closes  #11843 rb3753 - NFSv3/UDP server sends packets with wrong Source IP in header (picked from ncp3-gate)

@@ -21,10 +21,12 @@
 
 /*
  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  *  Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright 2012 Marcel Telka <marcel@telka.sk>
+ * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
  */
 
 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
 /*        All Rights Reserved   */
 

@@ -99,20 +101,23 @@
         svc_clts_kgetres,       /* Get pointer to response buffer */
         svc_clts_kfreeres,      /* Destroy pre-serialized response header */
         svc_clts_kclone_destroy, /* Destroy a clone xprt */
         svc_clts_kstart,        /* Tell `ready-to-receive' to rpcmod */
         svc_clts_kclone_xprt,   /* transport specific clone xprt function */
-        svc_clts_ktattrs        /* Transport specific attributes. */
+        svc_clts_ktattrs,       /* Transport specific attributes */
+        rpcmod_hold,            /* Increment transport reference count */
+        rpcmod_release          /* Decrement transport reference count */
 };
 
 /*
  * Transport private data.
  * Kept in xprt->xp_p2buf.
  */
 struct udp_data {
         mblk_t  *ud_resp;                       /* buffer for response */
         mblk_t  *ud_inmp;                       /* mblk chain of request */
+        sin6_t  ud_local;                       /* local address */
 };
 
 #define UD_MAXSIZE      8800
 #define UD_INITSIZE     2048
 

@@ -322,10 +327,12 @@
          */
         clone_xprt->xp_rtaddr.buf = (char *)mp->b_rptr +
             pptr->unitdata_ind.SRC_offset;
         clone_xprt->xp_rtaddr.len = pptr->unitdata_ind.SRC_length;
 
+        clone_xprt->xp_lcladdr.buf = (char *)&ud->ud_local;
+
         /*
          * Copy the local transport address in the service_transport
          * handle at the address in the request. We will have only
          * the local IP address in options.
          */

@@ -759,11 +766,11 @@
 #define XIDHASH(xid)    ((xid) % DRHASHSZ)
 #define DRHASH(dr)      XIDHASH((dr)->dr_xid)
 #define REQTOXID(req)   ((req)->rq_xprt->xp_xid)
 
 static int      ndupreqs = 0;
-int     maxdupreqs = MAXDUPREQS;
+volatile int    maxdupreqs = MAXDUPREQS;
 static kmutex_t dupreq_lock;
 static struct dupreq *drhashtbl[DRHASHSZ];
 static int      drhashstat[DRHASHSZ];
 
 static void unhash(struct dupreq *);