diff options
Diffstat (limited to 'usr/src/uts/common/io/mem.c')
-rw-r--r-- | usr/src/uts/common/io/mem.c | 20 |
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 */ |