From c31be7e56e5c1d4345df7c5baf6fb4f4c412d7aa Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 11 Feb 2008 14:11:41 +0000 Subject: - Applied some cleanups to party.c/guild.c to ensure that direct pointers to sd are only done for valid sd states. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12194 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/party.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'src/map/party.c') diff --git a/src/map/party.c b/src/map/party.c index 47648b889..fedd5ce1e 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -46,6 +46,26 @@ static void party_fill_member(struct party_member *member, struct map_session_da member->leader = 0; } +/*========================================== + * Retrieves and validates the sd pointer for this party member [Skotlex] + *------------------------------------------*/ + +static TBL_PC* party_sd_check(int party_id, int account_id, int char_id) +{ + TBL_PC* sd = map_id2sd(account_id); + + if (!(sd && sd->status.char_id == char_id && sd->state.auth && !sd->state.waitingdisconnect)) + return NULL; + + if (sd->status.party_id != party_id) + { //If player belongs to a different party, kick him out. + intif_party_leave(party_id,account_id,char_id); + return NULL; + } + + return sd; +} + /*========================================== * I *------------------------------------------*/ @@ -233,11 +253,7 @@ int party_recv_info(struct party *sp) for(i=0;iparty.member[i].account_id) continue; - sd = map_id2sd(p->party.member[i].account_id); - if (sd && sd->status.party_id==p->party.party_id - && sd->status.char_id == p->party.member[i].char_id - && sd->state.auth && !sd->state.waitingdisconnect) - p->data[i].sd = sd; + p->data[i].sd = party_sd_check(p->party.party_id, p->party.member[i].account_id, p->party.member[i].char_id); } party_check_state(p); for(i=0;istatus.char_id != char_id){ - if (flag == 0) { - ShowError("party: member added error %d is not online\n",account_id); + if (!flag) //Char logged off before being accepted into party. intif_party_leave(party_id,account_id,char_id); - } return 0; } sd->party_invite=0; @@ -507,7 +521,6 @@ int party_optionchanged(int party_id,int account_id,int exp,int item,int flag) /// - gains a level (disabled) int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short map,int online,int lv) { - struct map_session_data* sd; struct party_member* m; struct party_data* p; int i; @@ -528,8 +541,7 @@ int party_recv_movemap(int party_id,int account_id,int char_id, unsigned short m m->online = online; m->lv = lv; //Check if they still exist on this map server - sd = map_id2sd(m->account_id); - p->data[i].sd = (sd!=NULL && sd->status.party_id==p->party.party_id && sd->status.char_id == m->char_id && !sd->state.waitingdisconnect)?sd:NULL; + p->data[i].sd = party_sd_check(party_id, account_id, char_id); clif_party_info(p,NULL); return 0; -- cgit v1.2.3-70-g09d2