diff --git a/sys/dev/audio/audio.c b/sys/dev/audio/audio.c index c57c1ccb6dd1..6cc7e45a2674 100644 --- a/sys/dev/audio/audio.c +++ b/sys/dev/audio/audio.c @@ -1,4 +1,4 @@ -/* $NetBSD: audio.c,v 1.38 2020/01/08 13:05:02 isaki Exp $ */ +/* $NetBSD: audio.c,v 1.39 2020/01/08 13:30:15 isaki Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -142,7 +142,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.38 2020/01/08 13:05:02 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.39 2020/01/08 13:30:15 isaki Exp $"); #ifdef _KERNEL_OPT #include "audio.h" @@ -530,6 +530,7 @@ static int audio_mmap(struct audio_softc *, off_t *, size_t, int, int *, int *, struct uvm_object **, int *, audio_file_t *); static int audioctl_open(dev_t, struct audio_softc *, int, int, struct lwp *); +static int audioctl_close(struct audio_softc *, audio_file_t *); static void audio_pintr(void *); static void audio_rintr(void *); @@ -1521,7 +1522,7 @@ audioclose(struct file *fp) error = audio_close(sc, file); break; case AUDIOCTL_DEVICE: - error = 0; + error = audioctl_close(sc, file); break; case MIXER_DEVICE: error = mixer_close(sc, file); @@ -1530,10 +1531,8 @@ audioclose(struct file *fp) error = ENXIO; break; } - if (error == 0) { - kmem_free(fp->f_audioctx, sizeof(audio_file_t)); - fp->f_audioctx = NULL; - } + /* f_audioctx has already been freed in lower *_close() */ + fp->f_audioctx = NULL; return error; } @@ -2196,6 +2195,8 @@ audio_close(struct audio_softc *sc, audio_file_t *file) TRACE(3, "done"); audio_exit_exclusive(sc); + + kmem_free(file, sizeof(*file)); return 0; } @@ -3055,6 +3056,14 @@ audioctl_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt, return error; } +static int +audioctl_close(struct audio_softc *sc, audio_file_t *file) +{ + + kmem_free(file, sizeof(*file)); + return 0; +} + /* * Free 'mem' if available, and initialize the pointer. * For this reason, this is implemented as macro. @@ -7655,6 +7664,7 @@ mixer_close(struct audio_softc *sc, audio_file_t *file) mixer_remove(sc); mutex_exit(sc->sc_lock); + kmem_free(file, sizeof(*file)); return 0; }