Pārlūkot izejas kodu

fixed memory leak in guild_gvg_eliminate_timer and timer handling in npc_event_timer [Shinomori]

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1106 54d463be-8e91-2dee-dedb-b68131a5f0ec
shinomori 20 gadi atpakaļ
vecāks
revīzija
b4f99f38ef
2 mainītis faili ar 36 papildinājumiem un 11 dzēšanām
  1. 13 7
      src/map/guild.c
  2. 23 4
      src/map/npc.c

+ 13 - 7
src/map/guild.c

@@ -1500,15 +1500,21 @@ int guild_agit_end(void)
 
 int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data)
 {	// Run One NPC_Event[OnAgitEliminate]
-	size_t len = strlen((const char*)data);
-	char *evname=(char*)aCallocA(len + 4,sizeof(char));
+	char *name = (char*)data;
+	size_t len = (name) ? strlen(name) : 0; 
+	// the rest is dangerous, but let it crash,
+	// if this happens, it's ruined anyway
+	char *evname=(char*)aMalloc( (len + 4) * sizeof(char));
 	int c=0;
 
-	if(!agit_flag) return 0;	// Agit already End
-	memcpy(evname,(const char *)data,len - 5);
-	strcpy(evname + len - 5,"Eliminate");
-	c = npc_event_do(evname);
-	printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
+	if(agit_flag)	// Agit not already End
+	{
+		memcpy(evname,name,len - 5);
+		strcpy(evname + len - 5,"Eliminate");
+		c = npc_event_do(evname);
+		printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c);
+	}
+	if(name) aFree(name);
 	return 0;
 }
 

+ 23 - 4
src/map/npc.c

@@ -164,12 +164,31 @@ int npc_delete(struct npc_data *nd)
  */
 int npc_event_timer(int tid,unsigned int tick,int id,int data)
 {
+	char *eventname = (char *)data;
+	struct event_data *ev = (struct event_data *)strdb_search(ev_db,eventname);
+	struct npc_data *nd;
 	struct map_session_data *sd=map_id2sd(id);
-	if (sd==NULL)
-		return 0;
+	size_t i;
 
-	npc_event(sd,(const char *)data,0);
-	aFree((void*)data);
+	if((ev==NULL || (nd=ev->nd)==NULL))
+	{
+		if(battle_config.error_log)
+			printf("npc_event: event not found [%s]\n",eventname);
+	}	
+	else
+	{
+		for(i=0;i<MAX_EVENTTIMER;i++) {
+			if( nd->eventtimer[i]==tid ) {
+				nd->eventtimer[i]=-1;
+				npc_event(sd,eventname,0); // sd NULL check is within
+				break;
+			}
+		}
+		if(i==MAX_EVENTTIMER && battle_config.error_log)
+			printf("npc_event_timer: event timer not found [%s]!\n",eventname);
+	}
+
+	aFree(eventname);
 	return 0;
 }