Ver código fonte

Fixed memory leak on MvP tomb system, killer name now uses static buffer. (bugreport:5615)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@15954 54d463be-8e91-2dee-dedb-b68131a5f0ec
greenboxal2 13 anos atrás
pai
commit
4f4f19caf6
5 arquivos alterados com 10 adições e 9 exclusões
  1. 2 7
      src/map/mob.c
  2. 4 0
      src/map/mob.h
  3. 1 1
      src/map/npc.c
  4. 1 1
      src/map/npc.h
  5. 2 0
      src/map/unit.c

+ 2 - 7
src/map/mob.c

@@ -151,9 +151,9 @@ void mvptomb_create(struct mob_data *md, char *killer, time_t time)
 	nd->u.tomb.kill_time = time;
 	
 	if (killer)
-		nd->u.tomb.killer_name = aStrdup(killer); // Don't rely that killer name will be available all time
+		safestrncpy(nd->u.tomb.killer_name, killer, NAME_LENGTH);
 	else
-		nd->u.tomb.killer_name = NULL;
+		nd->u.tomb.killer_name[0] = NULL;
 
 	map_addnpc(nd->bl.m, nd);
 	map_addblock(&nd->bl);
@@ -168,12 +168,7 @@ void mvptomb_destroy(struct mob_data *md)
 	struct npc_data *nd = (struct npc_data *)map_id2bl(md->tomb_nid);
 
 	if (nd)
-	{
-		if (nd->u.tomb.killer_name)
-			aFree(nd->u.tomb.killer_name);
-		
 		npc_unload(nd);
-	}
 
 	md->tomb_nid = 0;
 }

+ 4 - 0
src/map/mob.h

@@ -287,4 +287,8 @@ int mob_clone_delete(struct mob_data *md);
 
 void mob_reload(void);
 
+// MvP Tomb System
+void mvptomb_create(struct mob_data *md, char *killer, time_t time);
+void mvptomb_destroy(struct mob_data *md);
+
 #endif /* _MOB_H_ */

+ 1 - 1
src/map/npc.c

@@ -1097,7 +1097,7 @@ void run_tomb(struct map_session_data* sd, struct npc_data* nd)
 	
     clif_scriptmes(sd, nd->bl.id, msg_txt(660));
 
-	snprintf(buffer, sizeof(buffer), msg_txt(661), nd->u.tomb.killer_name ? nd->u.tomb.killer_name : "Unknown");
+	snprintf(buffer, sizeof(buffer), msg_txt(661), nd->u.tomb.killer_name[0] ? nd->u.tomb.killer_name : "Unknown");
     clif_scriptmes(sd, nd->bl.id, buffer);
 
     clif_scriptclose(sd, nd->bl.id);

+ 1 - 1
src/map/npc.h

@@ -65,7 +65,7 @@ struct npc_data {
 		struct {
 			struct mob_data *md;
 			time_t kill_time;
-			char *killer_name;
+			char killer_name[NAME_LENGTH];
 		} tomb;
 	} u;
 };

+ 2 - 0
src/map/unit.c

@@ -2368,6 +2368,8 @@ int unit_free(struct block_list *bl, clr_type clrtype)
 			}
 			if( mob_is_clone(md->class_) )
 				mob_clone_delete(md);
+			if( md->tomb_nid )
+				mvptomb_destroy(md);
 			break;
 		}
 		case BL_HOM: