Browse Source

* Hunted down improper uses of va_list variables.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13383 54d463be-8e91-2dee-dedb-b68131a5f0ec
FlavioJS 16 years ago
parent
commit
7ae74b588b
11 changed files with 122 additions and 147 deletions
  1. 1 0
      Changelog-Trunk.txt
  2. 10 4
      src/common/showmsg.c
  3. 3 0
      src/common/strlib.c
  4. 33 57
      src/map/atcommand.c
  5. 0 2
      src/map/clif.c
  6. 20 28
      src/map/itemdb.c
  7. 49 38
      src/map/map.c
  8. 0 5
      src/map/mob.c
  9. 0 4
      src/map/npc.c
  10. 6 5
      src/map/party.c
  11. 0 4
      src/map/skill.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2008/11/22
+	* Hunted down improper uses of va_list variables.
 	* Hunted down the simpler 64bit pointer truncations. [FlavioJS]
 2008/11/18
 	* Rev. 13375 Autotrade characters will no longer get caught by Urgent Recall. (bugreport:2447) [L0ne_W0lf]

+ 10 - 4
src/common/showmsg.c

@@ -673,6 +673,7 @@ char timestamp_format[20] = ""; //For displaying Timestamps
 
 int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 {
+	va_list apcopy;
 	char prefix[100];
 #if defined(DEBUGLOGMAP) || defined(DEBUGLOGCHAR) || defined(DEBUGLOGLOGIN)
 	FILE *fp;
@@ -734,12 +735,16 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 	if (flag == MSG_ERROR || flag == MSG_FATALERROR || flag == MSG_SQL)
 	{	//Send Errors to StdErr [Skotlex]
 		FPRINTF(STDERR, "%s ", prefix);
-		VFPRINTF(STDERR, string, ap);
+		va_copy(apcopy, ap);
+		VFPRINTF(STDERR, string, apcopy);
+		va_end(apcopy);
 		FFLUSH(STDERR);
 	} else {
 		if (flag != MSG_NONE)
 			FPRINTF(STDOUT, "%s ", prefix);
-		VFPRINTF(STDOUT, string, ap);
+		va_copy(apcopy, ap);
+		VFPRINTF(STDOUT, string, apcopy);
+		va_end(apcopy);
 		FFLUSH(STDOUT);
 	}
 
@@ -751,7 +756,9 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 			FFLUSH(STDERR);
 		} else {
 			fprintf(fp,"%s ", prefix);
-			vfprintf(fp,string,ap);
+			va_copy(apcopy, ap);
+			vfprintf(fp,string,apcopy);
+			va_end(apcopy);
 			fclose(fp);
 		}
 	} else {
@@ -760,7 +767,6 @@ int _vShowMessage(enum msg_type flag, const char *string, va_list ap)
 	}
 #endif
 
-	va_end(ap);
 	return 0;
 }
 

+ 3 - 0
src/common/strlib.c

@@ -964,9 +964,12 @@ int StringBuf_Vprintf(StringBuf* self, const char* fmt, va_list ap)
 
 	for(;;)
 	{
+		va_list apcopy;
 		/* Try to print in the allocated space. */
 		size = self->max_ - (self->ptr_ - self->buf_);
+		va_copy(apcopy, ap);
 		n = vsnprintf(self->ptr_, size, fmt, ap);
+		va_end(ap);
 		/* If that worked, return the length. */
 		if( n > -1 && n < size )
 		{

+ 33 - 57
src/map/atcommand.c

@@ -2561,7 +2561,6 @@ static int atkillmonster_sub(struct block_list *bl, va_list ap)
 	struct mob_data *md;
 	int flag;
 	
-	nullpo_retr(0, ap);
 	nullpo_retr(0, md=(struct mob_data *)bl);
 	flag = va_arg(ap, int);
 
@@ -6311,35 +6310,12 @@ int atcommand_sound(const int fd, struct map_session_data *sd, const char *comma
 /*==========================================
  * 	MOB Search
  *------------------------------------------*/
-static int atmobsearch_sub(struct block_list *bl,va_list ap)
-{
-	int mob_id,fd;
-	static int number=0;
-	struct mob_data *md;
-
-	nullpo_retr(0, bl);
-
-	if(!ap){
-		number=0;
-		return 0;
-	}
-	mob_id = va_arg(ap,int);
-	fd = va_arg(ap,int);
-
-	md = (struct mob_data *)bl;
-
-	if(md && fd && (mob_id==-1 || (md->class_==mob_id))){
-		snprintf(atcmd_output, sizeof atcmd_output, "%2d[%3d:%3d] %s",
-				++number,bl->x, bl->y,md->name);
-		clif_displaymessage(fd, atcmd_output);
-	}
-	return 0;
-}
-
 int atcommand_mobsearch(const int fd, struct map_session_data* sd, const char* command, const char* message)
 {
 	char mob_name[100];
 	int mob_id,map_id = 0;
+	int number = 0;
+	struct s_mapiterator* it;
 
 	nullpo_retr(-1, sd);
 
@@ -6364,9 +6340,21 @@ int atcommand_mobsearch(const int fd, struct map_session_data* sd, const char* c
 	snprintf(atcmd_output, sizeof atcmd_output, "Mob Search... %s %s", mob_name, mapindex_id2name(sd->mapindex));
 	clif_displaymessage(fd, atcmd_output);
 
-	map_foreachinmap(atmobsearch_sub, map_id, BL_MOB, mob_id, fd);
+	it = mapit_geteachmob();
+	while( true )
+	{
+		TBL_MOB* md = (TBL_MOB*)mapit_next(it);
+		if( md == NULL )
+			break;// no more mobs
 
-	atmobsearch_sub(&sd->bl,0); // reset the counter
+		if( mob_id == -1 || md->class_ == mob_id )
+		{
+			++number;
+			snprintf(atcmd_output, sizeof atcmd_output, "%2d[%3d:%3d] %s", number, md->bl.x, md->bl.y, md->name);
+			clif_displaymessage(fd, atcmd_output);
+		}
+	}
+	mapit_free(it);
 
 	return 0;
 }
@@ -7021,36 +7009,12 @@ int atshowmobs_timer(int tid, unsigned int tick, int id, intptr data)
 	return 1;
 }
 
-static int atshowmobs_sub(struct block_list *bl,va_list ap)
-{
-	int mob_id;
-	struct map_session_data* sd;
-	static int number=0;
-	struct mob_data *md;
-
-	if(!ap){
-		number=0;
-		return 0;
-	}
-	mob_id = va_arg(ap,int);
-	sd = va_arg(ap,struct map_session_data*);
-
-	md = (struct mob_data *)bl;
-
-	if(md->special_state.ai || md->master_id)
-		 return 0; //Hide slaves and player summoned mobs. [Skotlex]
-
-	if(mob_id==-1 || md->class_==mob_id){
-		clif_viewpoint(sd, 1, 1, bl->x, bl->y, ++number, 0xFFFFFF);
-		add_timer(gettick()+5000, atshowmobs_timer, sd->bl.id, number);
-	}
-	return 0;
-}
-
 int atcommand_showmobs(const int fd, struct map_session_data* sd, const char* command, const char* message)
 {
 	char mob_name[100];
 	int mob_id,map_id = 0;
+	int number = 0;
+	struct s_mapiterator* it;
 
 	nullpo_retr(-1, sd);
 
@@ -7081,11 +7045,23 @@ int atcommand_showmobs(const int fd, struct map_session_data* sd, const char* co
 
 	snprintf(atcmd_output, sizeof atcmd_output, "Mob Search... %s %s",
 		mob_name, mapindex_id2name(sd->mapindex));
-		clif_displaymessage(fd, atcmd_output);
+	clif_displaymessage(fd, atcmd_output);
 
-	map_foreachinmap(atshowmobs_sub, map_id, BL_MOB, mob_id, sd);
+	it = mapit_geteachmob();
+	while( true )
+	{
+		TBL_MOB* md = (TBL_MOB*)mapit_next(it);
+		if( md == NULL )
+			break;// no more mobs
 
-	atshowmobs_sub(&sd->bl,0);
+		if( mob_id == -1 || md->class_ == mob_id )
+		{
+			++number;
+			clif_viewpoint(sd, 1, 1, md->bl.x, md->bl.y, number, 0xFFFFFF);
+			add_timer(gettick()+5000, atshowmobs_timer, sd->bl.id, number);
+		}
+	}
+	mapit_free(it);
 
 	return 0;
 }

+ 0 - 2
src/map/clif.c

@@ -171,7 +171,6 @@ int clif_send_sub(struct block_list *bl, va_list ap)
 	int len, type, fd;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, sd = (struct map_session_data *)bl);
 
 	fd = sd->fd;
@@ -3718,7 +3717,6 @@ void clif_01ac(struct block_list* bl)
 	struct map_session_data *sd;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 
 	sd=va_arg(ap,struct map_session_data*);
 

+ 20 - 28
src/map/itemdb.c

@@ -255,13 +255,13 @@ static void create_dummy_data(void)
 	dummy_item.view_id=UNKNOWN_ITEM_ID;
 }
 
-static void* create_item_data(DBKey key, va_list args)
+static struct item_data* create_item_data(int nameid)
 {
 	struct item_data *id;
 	CREATE(id, struct item_data, 1);
-	id->nameid=key.i;
-	id->weight=1;
-	id->type=IT_ETC;
+	id->nameid = nameid;
+	id->weight = 1;
+	id->type = IT_ETC;
 	return id;
 }
 
@@ -271,50 +271,42 @@ static void* create_item_data(DBKey key, va_list args)
 struct item_data* itemdb_load(int nameid)
 {
 	struct item_data *id;
-	DBKey key;
 
 	if( nameid >= 0 && nameid < ARRAYLENGTH(itemdb_array) )
 	{
 		id = itemdb_array[nameid];
-		if( id == NULL )
-		{
-			key.i = nameid;
-			id = itemdb_array[nameid] = (struct item_data*)create_item_data(key, NULL);
-		}
+		if( id == NULL || id == &dummy_item )
+			id = itemdb_array[nameid] = create_item_data(nameid);
 		return id;
 	}
 
-	id = (struct item_data*)idb_ensure(itemdb_other, nameid, create_item_data);
-	if( id == &dummy_item )
-	{// Remove dummy_item, replace by real data.
-		key.i = nameid;
-		id = (struct item_data*)create_item_data(key, NULL);
+	id = (struct item_data*)idb_get(itemdb_other, nameid);
+	if( id == NULL || id == &dummy_item )
+	{
+		id = create_item_data(nameid);
 		idb_put(itemdb_other, nameid, id);
 	}
 	return id;
 }
 
-static void* return_dummy_data(DBKey key, va_list args)
-{
-	ShowWarning("itemdb_search: Item ID %d does not exists in the item_db. Using dummy data.\n", key.i);
-	dummy_item.nameid = key.i;
-	return &dummy_item;
-}
-
 /*==========================================
  * Loads an item from the db. If not found, it will return the dummy item.
  *------------------------------------------*/
 struct item_data* itemdb_search(int nameid)
 {
+	struct item_data* id;
 	if( nameid >= 0 && nameid < ARRAYLENGTH(itemdb_array) )
+		id = itemdb_array[nameid];
+	else
+		id = (struct item_data*)idb_get(itemdb_other, nameid);
+
+	if( id == NULL )
 	{
-		DBKey key;
-		if( itemdb_array[nameid] )
-			return itemdb_array[nameid];
-		key.i = nameid;
-		return (struct item_data*)return_dummy_data(key, NULL);
+		ShowWarning("itemdb_search: Item ID %d does not exists in the item_db. Using dummy data.\n", nameid);
+		id = &dummy_item;
+		dummy_item.nameid = nameid;
 	}
-	return (struct item_data*)idb_ensure(itemdb_other,nameid,return_dummy_data);
+	return id;
 }
 
 /*==========================================

+ 49 - 38
src/map/map.c

@@ -511,13 +511,11 @@ struct skill_unit* map_find_skill_unit_oncell(struct block_list* target,int x,in
  *------------------------------------------*/
 int map_foreachinrange(int (*func)(struct block_list*,va_list), struct block_list* center, int range, int type, ...)
 {
-	va_list ap;
 	int bx,by,m;
 	int returnCount =0;	//total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
 	int blockcount=bl_list_count,i;
 	int x0,x1,y0,y1;
-	va_start(ap,type);
 
 	m = center->m;
 	x0 = max(center->x-range, 0);
@@ -562,11 +560,15 @@ int map_foreachinrange(int (*func)(struct block_list*,va_list), struct block_lis
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;	//[Skotlex]
 }
@@ -576,7 +578,6 @@ int map_foreachinrange(int (*func)(struct block_list*,va_list), struct block_lis
  *------------------------------------------*/
 int map_foreachinshootrange(int (*func)(struct block_list*,va_list),struct block_list* center, int range, int type,...)
 {
-	va_list ap;
 	int bx,by,m;
 	int returnCount =0;	//total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
@@ -587,8 +588,6 @@ int map_foreachinshootrange(int (*func)(struct block_list*,va_list),struct block
 	if (m < 0)
 		return 0;
 
-	va_start(ap,type);
-
 	x0 = max(center->x-range, 0);
 	y0 = max(center->y-range, 0);
 	x1 = min(center->x+range, map[m].xs-1);
@@ -633,11 +632,15 @@ int map_foreachinshootrange(int (*func)(struct block_list*,va_list),struct block
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;	//[Skotlex]
 }
@@ -649,7 +652,6 @@ int map_foreachinshootrange(int (*func)(struct block_list*,va_list),struct block
  *------------------------------------------*/
 int map_foreachinarea(int (*func)(struct block_list*,va_list), int m, int x0, int y0, int x1, int y1, int type, ...)
 {
-	va_list ap;
 	int bx,by;
 	int returnCount =0;	//total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
@@ -657,7 +659,6 @@ int map_foreachinarea(int (*func)(struct block_list*,va_list), int m, int x0, in
 
 	if (m < 0)
 		return 0;
-	va_start(ap,type);
 	if (x1 < x0)
 	{	//Swap range
 		bx = x0;
@@ -696,11 +697,15 @@ int map_foreachinarea(int (*func)(struct block_list*,va_list), int m, int x0, in
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;	//[Skotlex]
 }
@@ -717,13 +722,11 @@ int map_foreachinmovearea(int (*func)(struct block_list*,va_list), struct block_
 	int bx,by,m;
 	int returnCount =0;  //total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
-	va_list ap;
 	int blockcount=bl_list_count,i;
 	int x0, x1, y0, y1;
 
 	if (!range) return 0;
 	if (!dx && !dy) return 0; //No movement.
-	va_start(ap,type);
 	m = center->m;
 
 	x0 = center->x-range;
@@ -830,11 +833,15 @@ int map_foreachinmovearea(int (*func)(struct block_list*,va_list), struct block_
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;
 }
@@ -848,13 +855,10 @@ int map_foreachincell(int (*func)(struct block_list*,va_list), int m, int x, int
 	int bx,by;
 	int returnCount =0;  //total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
-	va_list ap;
 	int blockcount=bl_list_count,i;
 
 	if (x < 0 || y < 0 || x >= map[m].xs || y >= map[m].ys) return 0;
 
-	va_start(ap,type);
-
 	by=y/BLOCK_SIZE;
 	bx=x/BLOCK_SIZE;
 
@@ -875,11 +879,15 @@ int map_foreachincell(int (*func)(struct block_list*,va_list), int m, int x, int
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;
 }
@@ -924,7 +932,6 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y
 // kRO.
 
 	//Generic map_foreach* variables.
-	va_list ap;
 	int i, blockcount = bl_list_count;
 	struct block_list *bl;
 	int bx, by;
@@ -938,8 +945,6 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y
 	
 	if (m < 0)
 		return 0;
-		
-	va_start(ap,type);
 
 	len_limit = magnitude2 = MAGNITUDE2(x0,y0, x1,y1);
 	if (magnitude2 < 1) //Same begin and ending point, can't trace path.
@@ -1068,11 +1073,15 @@ int map_foreachinpath(int (*func)(struct block_list*,va_list),int m,int x0,int y
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	//This check is done in case some object gets killed due to further skill processing.
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;	//[Skotlex]
 
@@ -1084,11 +1093,8 @@ int map_foreachinmap(int (*func)(struct block_list*,va_list), int m, int type,..
 	int b, bsize;
 	int returnCount =0;  //total sum of returned values of func() [Skotlex]
 	struct block_list *bl;
-	va_list ap;
 	int blockcount=bl_list_count,i;
 
-	va_start(ap,type);
-
 	bsize = map[m].bxs * map[m].bys;
 
 	if(type&~BL_MOB)
@@ -1110,11 +1116,15 @@ int map_foreachinmap(int (*func)(struct block_list*,va_list), int m, int type,..
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
-			returnCount += func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			returnCount += func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();	// 解放を許可する
 
-	va_end(ap);
 	bl_list_count = blockcount;
 	return returnCount;
 }
@@ -1210,9 +1220,6 @@ void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...)
 {
 	int i;
 	int blockcount=bl_list_count;
-	va_list ap;
-
-	va_start(ap,type);
 
 	for(i=2;i<=last_object_id;i++){
 		if(objects[i]){
@@ -1230,11 +1237,15 @@ void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...)
 
 	for(i=blockcount;i<bl_list_count;i++)
 		if( bl_list[i]->prev || bl_list[i]->next )
-			func(bl_list[i],ap);
+		{
+			va_list ap;
+			va_start(ap, type);
+			func(bl_list[i], ap);
+			va_end(ap);
+		}
 
 	map_freeblock_unlock();
 
-	va_end(ap);
 	bl_list_count = blockcount;
 }
 
@@ -3271,7 +3282,7 @@ int cleanup_sub(struct block_list *bl, va_list ap)
 
 static int cleanup_db_sub(DBKey key,void *data,va_list va)
 {
-	return cleanup_sub((struct block_list*)data, NULL);
+	return cleanup_sub((struct block_list*)data, va);
 }
 
 /*==========================================

+ 0 - 5
src/map/mob.c

@@ -697,7 +697,6 @@ int mob_linksearch(struct block_list *bl,va_list ap)
 	unsigned int tick;
 	
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	md=(struct mob_data *)bl;
 	class_ = va_arg(ap, int);
 	target = va_arg(ap, struct block_list *);
@@ -898,7 +897,6 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
 	int dist;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	md=va_arg(ap,struct mob_data *);
 	target= va_arg(ap,struct block_list**);
 
@@ -946,7 +944,6 @@ static int mob_ai_sub_hard_changechase(struct block_list *bl,va_list ap)
 	struct block_list **target;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	md=va_arg(ap,struct mob_data *);
 	target= va_arg(ap,struct block_list**);
 
@@ -1708,7 +1705,6 @@ int mob_deleteslave_sub(struct block_list *bl,va_list ap)
 	int id;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, md = (struct mob_data *)bl);
 
 	id=va_arg(ap,int);
@@ -2771,7 +2767,6 @@ int mob_getfriendstatus_sub(struct block_list *bl,va_list ap)
 	int flag=0;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, md=(struct mob_data *)bl);
 	nullpo_retr(0, mmd=va_arg(ap,struct mob_data *));
 

+ 0 - 4
src/map/npc.c

@@ -92,7 +92,6 @@ int npc_enable_sub(struct block_list *bl, va_list ap)
 	struct npc_data *nd;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, nd=va_arg(ap,struct npc_data *));
 	if(bl->type == BL_PC && (sd=(struct map_session_data *)bl))
 	{
@@ -232,7 +231,6 @@ int npc_event_doall_sub(DBKey key, void* data, va_list ap)
 	int rid;
 
 	nullpo_retr(0, ev = (struct event_data *)data);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, c = va_arg(ap, int *));
 	nullpo_retr(0, name = va_arg(ap, const char *));
 	rid = va_arg(ap, int);
@@ -258,7 +256,6 @@ static int npc_event_do_sub(DBKey key, void* data, va_list ap)
 	const char* name;
 
 	nullpo_retr(0, ev = (struct event_data *)data);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, c = va_arg(ap, int *));
 	nullpo_retr(0, name = va_arg(ap, const char *));
 
@@ -1795,7 +1792,6 @@ int npc_convertlabel_db(DBKey key, void* data, va_list ap)
 	const char *p;
 	int len;
 
-	nullpo_retr(0, ap);
 	nullpo_retr(0, label_list = va_arg(ap,struct npc_label_list**));
 	nullpo_retr(0, label_list_num = va_arg(ap,int*));
 	nullpo_retr(0, filepath = va_arg(ap,const char*));

+ 6 - 5
src/map/party.c

@@ -929,7 +929,6 @@ int party_sub_count(struct block_list *bl, va_list ap)
 int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...)
 {
 	struct party_data *p;
-	va_list ap;
 	int i;
 	int x0,y0,x1,y1;
 	struct block_list *list[MAX_PARTY];
@@ -946,8 +945,6 @@ int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_sess
 	x1=sd->bl.x+range;
 	y1=sd->bl.y+range;
 
-	va_start(ap,range);
-	
 	for(i=0;i<MAX_PARTY;i++)
 	{
 		struct map_session_data *psd = p->data[i].sd;
@@ -964,10 +961,14 @@ int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_sess
 	map_freeblock_lock();
 	
 	for(i=0;i<blockcount;i++)
-		total += func(list[i],ap);
+	{
+		va_list ap;
+		va_start(ap, range);
+		total += func(list[i], ap);
+		va_end(ap);
+	}
 
 	map_freeblock_unlock();
 
-	va_end(ap);
 	return total;
 }

+ 0 - 4
src/map/skill.c

@@ -1801,7 +1801,6 @@ int skill_area_sub (struct block_list *bl, va_list ap)
 	SkillFunc func;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 
 	src=va_arg(ap,struct block_list *);
 	skill_id=va_arg(ap,int);
@@ -7569,7 +7568,6 @@ static int skill_check_condition_char_sub (struct block_list *bl, va_list ap)
 	int *p_sd;	//Contains the list of characters found.
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, tsd=(struct map_session_data*)bl);
 	nullpo_retr(0, src=va_arg(ap,struct block_list *));
 	nullpo_retr(0, sd=(struct map_session_data*)src);
@@ -9025,7 +9023,6 @@ int skill_frostjoke_scream (struct block_list *bl, va_list ap)
 	unsigned int tick;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, src=va_arg(ap,struct block_list*));
 
 	skillnum=va_arg(ap,int);
@@ -9189,7 +9186,6 @@ int skill_greed (struct block_list *bl, va_list ap)
 	struct flooritem_data *fitem=NULL;
 
 	nullpo_retr(0, bl);
-	nullpo_retr(0, ap);
 	nullpo_retr(0, src = va_arg(ap, struct block_list *));
 
 	if(src->type == BL_PC && (sd=(struct map_session_data *)src) && bl->type==BL_ITEM && (fitem=(struct flooritem_data *)bl))