Module Name:    src
Committed By:   isaki
Date:           Wed Jan  8 13:30:16 UTC 2020

Modified Files:
        src/sys/dev/audio: audio.c

Log Message:
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().


To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/dev/audio/audio.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/audio/audio.c
diff -u src/sys/dev/audio/audio.c:1.38 src/sys/dev/audio/audio.c:1.39
--- src/sys/dev/audio/audio.c:1.38	Wed Jan  8 13:05:02 2020
+++ src/sys/dev/audio/audio.c	Wed Jan  8 13:30:15 2020
@@ -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
 	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, audi
 
 	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_so
 	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, audi
 	mixer_remove(sc);
 	mutex_exit(sc->sc_lock);
 
+	kmem_free(file, sizeof(*file));
 	return 0;
 }
 

Reply via email to