Print this page
11927 Log, or optionally panic, on zero-length kmem allocations
Reviewed by: Dan McDonald <danmcd@joyent.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
@@ -22,10 +22,14 @@
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
+/*
+ * Copyright (c) 2015 Joyent, Inc. All rights reserved.
+ */
+
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/cred.h>
#include <sys/modctl.h>
#include <sys/vfs.h>
@@ -1377,16 +1381,22 @@
portq->portq_flags |= PORTQ_WAIT_EVENTS; /* detect incoming events */
mutex_exit(&portq->portq_mutex); /* event queue can be reused now */
if (model == DATAMODEL_NATIVE) {
eventsz = sizeof (port_event_t);
+
+ if (nmax == 0) {
+ kevp = NULL;
+ } else {
kevp = kmem_alloc(eventsz * nmax, KM_NOSLEEP);
if (kevp == NULL) {
if (nmax > pp->port_max_list)
nmax = pp->port_max_list;
kevp = kmem_alloc(eventsz * nmax, KM_SLEEP);
}
+ }
+
results = kevp;
lev = NULL; /* start with first event in the queue */
for (nevents = 0; nevents < nmax; ) {
pev = port_get_kevent(glist, lev);
if (pev == NULL) /* no more events available */
@@ -1419,16 +1429,22 @@
#ifdef _SYSCALL32_IMPL
} else {
port_event32_t *kevp32;
eventsz = sizeof (port_event32_t);
+
+ if (nmax == 0) {
+ kevp32 = NULL;
+ } else {
kevp32 = kmem_alloc(eventsz * nmax, KM_NOSLEEP);
if (kevp32 == NULL) {
if (nmax > pp->port_max_list)
nmax = pp->port_max_list;
kevp32 = kmem_alloc(eventsz * nmax, KM_SLEEP);
}
+ }
+
results = kevp32;
lev = NULL; /* start with first event in the queue */
for (nevents = 0; nevents < nmax; ) {
pev = port_get_kevent(glist, lev);
if (pev == NULL) /* no more events available */