svn commit: r234201 - head/sys/kern

Adrian Chadd adrian at FreeBSD.org
Fri Apr 13 04:22:42 UTC 2012


Author: adrian
Date: Fri Apr 13 04:22:42 2012
New Revision: 234201
URL: http://svn.freebsd.org/changeset/base/234201

Log:
  Use strdup() on the name (and free it when it's done) so non-static names
  can be used in firmware_register().

Modified:
  head/sys/kern/subr_firmware.c

Modified: head/sys/kern/subr_firmware.c
==============================================================================
--- head/sys/kern/subr_firmware.c	Fri Apr 13 04:21:54 2012	(r234200)
+++ head/sys/kern/subr_firmware.c	Fri Apr 13 04:22:42 2012	(r234201)
@@ -175,6 +175,9 @@ firmware_register(const char *imagename,
     unsigned int version, const struct firmware *parent)
 {
 	struct priv_fw *match, *frp;
+	char *str;
+
+	str = strdup(imagename, M_TEMP);
 
 	mtx_lock(&firmware_mtx);
 	/*
@@ -185,16 +188,18 @@ firmware_register(const char *imagename,
 		mtx_unlock(&firmware_mtx);
 		printf("%s: image %s already registered!\n",
 			__func__, imagename);
+		free(str, M_TEMP);
 		return NULL;
 	}
 	if (frp == NULL) {
 		mtx_unlock(&firmware_mtx);
 		printf("%s: cannot register image %s, firmware table full!\n",
 		    __func__, imagename);
+		free(str, M_TEMP);
 		return NULL;
 	}
 	bzero(frp, sizeof(frp));	/* start from a clean record */
-	frp->fw.name = imagename;
+	frp->fw.name = str;
 	frp->fw.data = data;
 	frp->fw.datasize = datasize;
 	frp->fw.version = version;
@@ -230,7 +235,7 @@ firmware_unregister(const char *imagenam
 		err = 0;
 	} else if (fp->refcnt != 0) {	/* cannot unregister */
 		err = EBUSY;
-	}  else {
+	} else {
 		linker_file_t x = fp->file;	/* save value */
 
 		/*
@@ -238,6 +243,7 @@ firmware_unregister(const char *imagenam
 		 * do not forget anything. Then restore 'file' which is
 		 * non-null for autoloaded images.
 		 */
+		free((void *) (uintptr_t) fp->fw.name, M_TEMP);
 		bzero(fp, sizeof(struct priv_fw));
 		fp->file = x;
 		err = 0;


More information about the svn-src-head mailing list