Fix an resource leak on audiobell close.
audioclose() freed audio_file_t structure, but only audiobellclose didn't pass there. I change that all of freeing audio_file_t is done by each *_close().
This commit is contained in:
parent
4d15c1eb43
commit
3b9c5d089b
@ -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 <sys/cdefs.h>
|
||||
__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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user