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