diff --git a/sys/dev/audio/audio.c b/sys/dev/audio/audio.c index cda5d25d6b04..13bba8cc603d 100644 --- a/sys/dev/audio/audio.c +++ b/sys/dev/audio/audio.c @@ -2348,10 +2348,20 @@ audio_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, af = kmem_zalloc(sizeof(audio_file_t), KM_SLEEP); af->sc = sc; af->dev = dev; - if ((flags & FWRITE) != 0 && audio_can_playback(sc)) + if (flags & FWRITE) { + if (!audio_can_playback(sc)) { + error = ENXIO; + goto bad; + } af->mode |= AUMODE_PLAY | AUMODE_PLAY_ALL; - if ((flags & FREAD) != 0 && audio_can_capture(sc)) + } + if (flags & FREAD) { + if (!audio_can_capture(sc)) { + error = ENXIO; + goto bad; + } af->mode |= AUMODE_RECORD; + } if (af->mode == 0) { error = ENXIO; goto bad; @@ -2909,7 +2919,8 @@ audio_write(struct audio_softc *sc, struct uio *uio, int ioflag, int error; track = file->ptrack; - KASSERT(track); + if (track == NULL) + return EPERM; /* I think it's better than EINVAL. */ if (track->mmapped)