diff --git a/package/unvram/Makefile b/package/unvram/Makefile
index 2fab89a6341..c62873e6fb2 100644
--- a/package/unvram/Makefile
+++ b/package/unvram/Makefile
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=unvram
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
diff --git a/package/unvram/src/nvram.c b/package/unvram/src/nvram.c
index a5f1d435089..78baa9431d3 100644
--- a/package/unvram/src/nvram.c
+++ b/package/unvram/src/nvram.c
@@ -338,6 +338,7 @@ int nvram_commit(nvram_handle_t *h)
 nvram_handle_t * nvram_open(const char *file, int rdonly)
 {
 	int fd;
+	char *mtd = NULL;
 	nvram_handle_t *h;
 	nvram_header_t *header;
 
@@ -345,16 +346,14 @@ nvram_handle_t * nvram_open(const char *file, int rdonly)
 	if( (nvram_erase_size == 0) || (file == NULL) )
 	{
 		/* Finding the mtd will set the appropriate erase size */
-		if( file == NULL )
-			file = nvram_find_mtd();
-		else
-			(void) nvram_find_mtd();
-
-		if( nvram_erase_size == 0 )
+		if( (mtd = nvram_find_mtd()) == NULL || nvram_erase_size == 0 )
+		{
+			free(mtd);
 			return NULL;
+		}
 	}
 
-	if( (fd = open(file, O_RDWR)) > -1 )
+	if( (fd = open(file ? file : mtd, O_RDWR)) > -1 )
 	{
 		char *mmap_area = (char *) mmap(
 			NULL, nvram_erase_size, PROT_READ | PROT_WRITE,
@@ -377,6 +376,7 @@ nvram_handle_t * nvram_open(const char *file, int rdonly)
 				if( header->magic == NVRAM_MAGIC )
 				{
 					_nvram_rehash(h);
+					free(mtd);
 					return h;
 				}
 				else
@@ -388,6 +388,7 @@ nvram_handle_t * nvram_open(const char *file, int rdonly)
 		}
 	}
 
+	free(mtd);
 	return NULL;
 }
 
@@ -403,7 +404,7 @@ int nvram_close(nvram_handle_t *h)
 }
 
 /* Determine NVRAM device node. */
-const char * nvram_find_mtd(void)
+char * nvram_find_mtd(void)
 {
 	FILE *fp;
 	int i, esz;
@@ -411,13 +412,11 @@ const char * nvram_find_mtd(void)
 	char *path = NULL;
 	struct stat s;
 
-	// "/dev/mtdblock/" + ( 0 < x < 99 ) + \0 = 19
-	if( (path = (char *) malloc(19)) == NULL )
-		return NULL;
-
-	if ((fp = fopen("/proc/mtd", "r"))) {
-		while (fgets(dev, sizeof(dev), fp)) {
-			if (strstr(dev, "nvram") && sscanf(dev, "mtd%d: %08x", &i, &esz))
+	if( (fp = fopen("/proc/mtd", "r")) )
+	{
+		while( fgets(dev, sizeof(dev), fp) )
+		{
+			if( strstr(dev, "nvram") && sscanf(dev, "mtd%d: %08x", &i, &esz) )
 			{
 				nvram_erase_size = esz;
 
@@ -451,7 +450,7 @@ const char * nvram_find_mtd(void)
 }
 
 /* Check NVRAM staging file. */
-const char * nvram_find_staging(void)
+char * nvram_find_staging(void)
 {
 	struct stat s;
 
@@ -467,7 +466,7 @@ const char * nvram_find_staging(void)
 int nvram_to_staging(void)
 {
 	int fdmtd, fdstg, stat;
-	const char *mtd = nvram_find_mtd();
+	char *mtd = nvram_find_mtd();
 	char buf[nvram_erase_size];
 
 	stat = -1;
@@ -492,6 +491,7 @@ int nvram_to_staging(void)
 		}
 	}
 
+	free(mtd);
 	return stat;
 }
 
@@ -499,7 +499,7 @@ int nvram_to_staging(void)
 int staging_to_nvram(void)
 {
 	int fdmtd, fdstg, stat;
-	const char *mtd = nvram_find_mtd();
+	char *mtd = nvram_find_mtd();
 	char buf[nvram_erase_size];
 
 	stat = -1;
@@ -526,5 +526,6 @@ int staging_to_nvram(void)
 		}
 	}
 
+	free(mtd);
 	return stat;
 }
diff --git a/package/unvram/src/nvram.h b/package/unvram/src/nvram.h
index b718928c0e5..e3d64613d48 100644
--- a/package/unvram/src/nvram.h
+++ b/package/unvram/src/nvram.h
@@ -90,7 +90,7 @@ uint8_t hndcrc8 (uint8_t * pdata, uint32_t nbytes, uint8_t crc);
 uint8_t nvram_calc_crc(nvram_header_t * nvh);
 
 /* Determine NVRAM device node. */
-const char * nvram_find_mtd(void);
+char * nvram_find_mtd(void);
 
 /* Copy NVRAM contents to staging file. */
 int nvram_to_staging(void);
@@ -99,7 +99,7 @@ int nvram_to_staging(void);
 int staging_to_nvram(void);
 
 /* Check NVRAM staging file. */
-const char * nvram_find_staging(void);
+char * nvram_find_staging(void);
 
 
 /* Staging file for NVRAM */