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 */