Print this page
11928 rpcmod's clnt_cots can do zero-length kmem allocations
@@ -20,10 +20,11 @@
*/
/*
* 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,11 +1935,12 @@
*/
if (srcaddr->len != lru_entry->x_src.len) {
if (srcaddr->len > 0)
kmem_free(srcaddr->buf,
srcaddr->maxlen);
- srcaddr->buf = kmem_zalloc(
+ 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,11 +2091,11 @@
* 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);
+ 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,13 +2256,15 @@
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);
+ 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,14 +2442,14 @@
* 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,
+ 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;
+ 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);