Pārlūkot izejas kodu

Fixed memleak hell during mapserver shutdown (if grf reading is used and the deallocation routine is actually called).

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11439 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 17 gadi atpakaļ
vecāks
revīzija
74c5d717aa
3 mainītis faili ar 24 papildinājumiem un 10 dzēšanām
  1. 11 5
      src/common/grfio.c
  2. 2 0
      src/map/map.c
  3. 11 5
      src/tool/grfio.c

+ 11 - 5
src/common/grfio.c

@@ -777,20 +777,26 @@ static int grfio_add(char* fname)
 // removes all entries
 void grfio_final(void)
 {
-	if (filelist != NULL)
-		aFree(filelist);
+	if (filelist != NULL) {
+		int i;
+		for (i = 0; i < filelist_entrys; i++)
+			if (filelist[i].fnd != NULL)
+				aFree(filelist[i].fnd);
 
+		aFree(filelist);
+		filelist = NULL;
+	}
 	filelist_entrys = filelist_maxentry = 0;
 
 	if (gentry_table != NULL) {
 		int i;
-		for (i = 0; i < gentry_entrys; i++) {
+		for (i = 0; i < gentry_entrys; i++)
 			if (gentry_table[i] != NULL)
 				aFree(gentry_table[i]);
-		}
+
 		aFree(gentry_table);
+		gentry_table = NULL;
 	}
-	gentry_table = NULL;
 	gentry_entrys = gentry_maxentry = 0;
 }
 

+ 2 - 0
src/map/map.c

@@ -3189,6 +3189,8 @@ void do_final(void)
 	}
 
 	mapindex_final();
+	if(enable_grf)
+		grfio_final();
 
 	id_db->destroy(id_db, NULL);
 	pc_db->destroy(pc_db, NULL);

+ 11 - 5
src/tool/grfio.c

@@ -776,20 +776,26 @@ static int grfio_add(char* fname)
 // removes all entries
 void grfio_final(void)
 {
-	if (filelist != NULL)
-		free(filelist);
+	if (filelist != NULL) {
+		int i;
+		for (i = 0; i < filelist_entrys; i++)
+			if (filelist[i].fnd != NULL)
+				free(filelist[i].fnd);
 
+		free(filelist);
+		filelist = NULL;
+	}
 	filelist_entrys = filelist_maxentry = 0;
 
 	if (gentry_table != NULL) {
 		int i;
-		for (i = 0; i < gentry_entrys; i++) {
+		for (i = 0; i < gentry_entrys; i++)
 			if (gentry_table[i] != NULL)
 				free(gentry_table[i]);
-		}
+
 		free(gentry_table);
+		gentry_table = NULL;
 	}
-	gentry_table = NULL;
 	gentry_entrys = gentry_maxentry = 0;
 }