diff options
author | imp <imp@FreeBSD.org> | 2000-07-19 06:32:00 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2000-07-19 06:32:00 +0000 |
commit | 141cdecc82d2e817892277d9cb0e80112ed9661f (patch) | |
tree | 76cc13ea075c889bf024521c1d2f10479d143b5e /sys/i386/bios/apm.c | |
parent | 174b0abb778419b135794001f2dc68abaf345e67 (diff) | |
download | FreeBSD-src-141cdecc82d2e817892277d9cb0e80112ed9661f.zip FreeBSD-src-141cdecc82d2e817892277d9cb0e80112ed9661f.tar.gz |
Except for the information gathering IOCTLs, require apm device be
opened for write. This should make the apm device read only safe.
Diffstat (limited to 'sys/i386/bios/apm.c')
-rw-r--r-- | sys/i386/bios/apm.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/i386/bios/apm.c b/sys/i386/bios/apm.c index 4eb99dd..6b00464 100644 --- a/sys/i386/bios/apm.c +++ b/sys/i386/bios/apm.c @@ -1169,6 +1169,8 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) #endif switch (cmd) { case APMIO_SUSPEND: + if (!(flag & FWRITE)) + return (EPERM); if (sc->active) apm_suspend(PMST_SUSPEND); else @@ -1176,6 +1178,8 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) break; case APMIO_STANDBY: + if (!(flag & FWRITE)) + return (EPERM); if (sc->active) apm_suspend(PMST_STANDBY); else @@ -1203,23 +1207,35 @@ apmioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) error = ENXIO; break; case APMIO_ENABLE: + if (!(flag & FWRITE)) + return (EPERM); apm_event_enable(); break; case APMIO_DISABLE: + if (!(flag & FWRITE)) + return (EPERM); apm_event_disable(); break; case APMIO_HALTCPU: + if (!(flag & FWRITE)) + return (EPERM); apm_halt_cpu(); break; case APMIO_NOTHALTCPU: + if (!(flag & FWRITE)) + return (EPERM); apm_not_halt_cpu(); break; case APMIO_DISPLAY: + if (!(flag & FWRITE)) + return (EPERM); newstate = *(int *)addr; if (apm_display(newstate)) error = ENXIO; break; case APMIO_BIOS: + if (!(flag & FWRITE)) + return (EPERM); /* XXX compatibility with the old interface */ args = (struct apm_bios_arg *)addr; sc->bios.r.eax = args->eax; |