summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/mem.c')
-rw-r--r--usr/src/uts/common/io/mem.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/mem.c b/usr/src/uts/common/io/mem.c
index 2faf0794d8..fcea4a8f03 100644
--- a/usr/src/uts/common/io/mem.c
+++ b/usr/src/uts/common/io/mem.c
@@ -25,7 +25,7 @@
*/
/*
- * Copyright (c) 2015, Joyent, Inc. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
* Copyright 2017 James S Blachly, MD <james.blachly@gmail.com>
*/
@@ -225,10 +225,19 @@ mmopen(dev_t *devp, int flag, int typ, struct cred *cred)
case M_NULL:
case M_ZERO:
case M_FULL:
+ /* standard devices */
+ break;
+
case M_MEM:
case M_KMEM:
case M_ALLKMEM:
- /* standard devices */
+ /*
+ * These devices should never be visible in a zone, but if they
+ * somehow do get created we refuse to allow the zone to use
+ * them.
+ */
+ if (crgetzoneid(cred) != GLOBAL_ZONEID)
+ return (EACCES);
break;
default:
@@ -259,10 +268,11 @@ mmchpoll(dev_t dev, short events, int anyyet, short *reventsp,
POLLWRNORM | POLLRDBAND | POLLWRBAND);
/*
* A non NULL pollhead pointer should be returned in case
- * user polls for 0 events.
+ * user polls for 0 events or is doing an edge-triggerd poll.
*/
- *phpp = !anyyet && !*reventsp ?
- &mm_pollhd : (struct pollhead *)NULL;
+ if ((!*reventsp && !anyyet) || (events & POLLET)) {
+ *phpp = &mm_pollhd;
+ }
return (0);
default:
/* no other devices currently support polling */