Print this page
11928 rpcmod's clnt_cots can do zero-length kmem allocations
        
*** 20,29 ****
--- 20,30 ----
   */
  
  /*
   * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
   * Copyright (c) 2016 by Delphix. All rights reserved.
+  * Copyright 2019 Joyent, Inc.
   */
  
  /*
   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
*** 1934,1944 ****
                           */
                          if (srcaddr->len != lru_entry->x_src.len) {
                                  if (srcaddr->len > 0)
                                          kmem_free(srcaddr->buf,
                                              srcaddr->maxlen);
!                                 srcaddr->buf = kmem_zalloc(
                                      lru_entry->x_src.len, KM_SLEEP);
                                  srcaddr->maxlen = srcaddr->len =
                                      lru_entry->x_src.len;
                          }
                          bcopy(lru_entry->x_src.buf, srcaddr->buf, srcaddr->len);
--- 1935,1946 ----
                           */
                          if (srcaddr->len != lru_entry->x_src.len) {
                                  if (srcaddr->len > 0)
                                          kmem_free(srcaddr->buf,
                                              srcaddr->maxlen);
!                                 ASSERT(lru_entry->x_src.len != 0);
!                                 srcaddr->buf = kmem_alloc(
                                      lru_entry->x_src.len, KM_SLEEP);
                                  srcaddr->maxlen = srcaddr->len =
                                      lru_entry->x_src.len;
                          }
                          bcopy(lru_entry->x_src.buf, srcaddr->buf, srcaddr->len);
*** 2089,2099 ****
           * Set up a transport entry in the connection manager's list.
           */
          cm_entry = (struct cm_xprt *)
              kmem_zalloc(sizeof (struct cm_xprt), KM_SLEEP);
  
!         cm_entry->x_server.buf = kmem_zalloc(destaddr->len, KM_SLEEP);
          bcopy(destaddr->buf, cm_entry->x_server.buf, destaddr->len);
          cm_entry->x_server.len = cm_entry->x_server.maxlen = destaddr->len;
  
          cm_entry->x_state_flags = X_THREAD;
          cm_entry->x_ref = 1;
--- 2091,2101 ----
           * Set up a transport entry in the connection manager's list.
           */
          cm_entry = (struct cm_xprt *)
              kmem_zalloc(sizeof (struct cm_xprt), KM_SLEEP);
  
!         cm_entry->x_server.buf = kmem_alloc(destaddr->len, KM_SLEEP);
          bcopy(destaddr->buf, cm_entry->x_server.buf, destaddr->len);
          cm_entry->x_server.len = cm_entry->x_server.maxlen = destaddr->len;
  
          cm_entry->x_state_flags = X_THREAD;
          cm_entry->x_ref = 1;
*** 2254,2266 ****
          mutex_enter(&connmgr_lock);
  
          /*
           * Set up a transport entry in the connection manager's list.
           */
!         cm_entry->x_src.buf = kmem_zalloc(srcaddr->len, KM_SLEEP);
          bcopy(srcaddr->buf, cm_entry->x_src.buf, srcaddr->len);
          cm_entry->x_src.len = cm_entry->x_src.maxlen = srcaddr->len;
  
          cm_entry->x_tiptr = tiptr;
          cm_entry->x_time = ddi_get_lbolt();
  
          if (tiptr->tp_info.servtype == T_COTS_ORD)
--- 2256,2270 ----
          mutex_enter(&connmgr_lock);
  
          /*
           * Set up a transport entry in the connection manager's list.
           */
!         if (srcaddr->len > 0) {
!                 cm_entry->x_src.buf = kmem_alloc(srcaddr->len, KM_SLEEP);
                  bcopy(srcaddr->buf, cm_entry->x_src.buf, srcaddr->len);
                  cm_entry->x_src.len = cm_entry->x_src.maxlen = srcaddr->len;
+         } /* Else kmem_zalloc() of cm_entry already sets its x_src to NULL. */
  
          cm_entry->x_tiptr = tiptr;
          cm_entry->x_time = ddi_get_lbolt();
  
          if (tiptr->tp_info.servtype == T_COTS_ORD)
*** 2438,2451 ****
                   * in case of a later retry.
                   */
                  if (srcaddr->len != cm_entry->x_src.len) {
                          if (srcaddr->maxlen > 0)
                                  kmem_free(srcaddr->buf, srcaddr->maxlen);
!                         srcaddr->buf = kmem_zalloc(cm_entry->x_src.len,
                              KM_SLEEP);
!                         srcaddr->maxlen = srcaddr->len =
!                             cm_entry->x_src.len;
                  }
                  bcopy(cm_entry->x_src.buf, srcaddr->buf, srcaddr->len);
          }
          cm_entry->x_time = ddi_get_lbolt();
          mutex_exit(&connmgr_lock);
--- 2442,2455 ----
                   * in case of a later retry.
                   */
                  if (srcaddr->len != cm_entry->x_src.len) {
                          if (srcaddr->maxlen > 0)
                                  kmem_free(srcaddr->buf, srcaddr->maxlen);
!                         ASSERT(cm_entry->x_src.len != 0);
!                         srcaddr->buf = kmem_alloc(cm_entry->x_src.len,
                              KM_SLEEP);
!                         srcaddr->maxlen = srcaddr->len = cm_entry->x_src.len;
                  }
                  bcopy(cm_entry->x_src.buf, srcaddr->buf, srcaddr->len);
          }
          cm_entry->x_time = ddi_get_lbolt();
          mutex_exit(&connmgr_lock);