From 296629e067563e82b4a08b2a785d1c2f13b5a285 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Thu, 26 Jun 2014 11:22:50 -0700 Subject: Add null pointer checks for disconnected internals --- src/admin/ladmin.cpp | 1 + src/char/char.cpp | 21 ++++++--------------- src/map/chrif.cpp | 18 ++++++++++++++++++ src/map/intif.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/admin/ladmin.cpp b/src/admin/ladmin.cpp index ba55d73..69fc074 100644 --- a/src/admin/ladmin.cpp +++ b/src/admin/ladmin.cpp @@ -295,6 +295,7 @@ void ladmin_log(XString line) static __attribute__((noreturn)) void delete_fromlogin(Session *) { + login_session = nullptr; { PRINTF("Impossible to have a connection with the login-server [%s:%d] !\n"_fmt, login_ip, login_port); diff --git a/src/char/char.cpp b/src/char/char.cpp index c26fa64..a0a92f1 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -2045,7 +2045,7 @@ void parse_frommap(Session *ms) Packet_Head<0x2720> head_20; head_20.account_id = account_id; AString& repeat_20 = repeat; - send_vpacket<0x2720, 8, 1>(ms, head_20, repeat_20); + send_vpacket<0x2720, 8, 1>(login_session, head_20, repeat_20); } else { @@ -2414,13 +2414,11 @@ void parse_char(Session *s) { IP4Address ip = s->client_ip; + assert (s != login_session); + if (!login_session) { s->set_eof(); - - // I sure *hope* this doesn't happen ... - if (s == login_session) - login_session = nullptr; return; } @@ -2499,8 +2497,8 @@ void parse_char(Session *s) if (max_connect_user == 0 || count_users() < max_connect_user) { - if (login_session) - { // don't send request if no login-server + { + // there is always a login server // request to login-server to obtain e-mail/time limit Packet_Fixed<0x2716> fixed_16; fixed_16.account_id = sd->account_id; @@ -2524,9 +2522,8 @@ void parse_char(Session *s) } // authentification not found { - if (login_session) { - // don't send request if no login-server + // there is always a login-server Packet_Fixed<0x2712> fixed_12; fixed_12.account_id = sd->account_id; fixed_12.login_id1 = sd->login_id1; @@ -2535,12 +2532,6 @@ void parse_char(Session *s) fixed_12.ip = s->client_ip; send_fpacket<0x2712, 19>(login_session, fixed_12); } - else - { // if no login-server, we must refuse connection - Packet_Fixed<0x006c> fixed_6c; - fixed_6c.code = 0; - send_fpacket<0x006c, 3>(s, fixed_6c); - } } } x65_out: diff --git a/src/map/chrif.cpp b/src/map/chrif.cpp index ff0adbd..55e5810 100644 --- a/src/map/chrif.cpp +++ b/src/map/chrif.cpp @@ -214,6 +214,9 @@ int chrif_changemapserver(dumb_ptr sd, { nullpo_retr(-1, sd); + if (!char_session) + return -1; + IP4Address s_ip; for (io::FD i : iter_fds()) { @@ -395,6 +398,9 @@ int chrif_charselectreq(dumb_ptr sd) */ void chrif_changegm(AccountId id, ZString pass) { + if (!char_session) + return; + if (battle_config.etc_log) PRINTF("chrif_changegm: account: %d, password: '%s'.\n"_fmt, id, pass); @@ -410,6 +416,9 @@ void chrif_changegm(AccountId id, ZString pass) void chrif_changeemail(AccountId id, AccountEmail actual_email, AccountEmail new_email) { + if (!char_session) + return; + if (battle_config.etc_log) PRINTF("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n"_fmt, id, actual_email, new_email); @@ -435,6 +444,9 @@ void chrif_changeemail(AccountId id, AccountEmail actual_email, void chrif_char_ask_name(AccountId id, CharName character_name, short operation_type, HumanTimeDiff modif) { + if (!char_session) + return; + Packet_Fixed<0x2b0e> fixed_0e; fixed_0e.account_id = id; // who ask, or nobody fixed_0e.char_name = character_name; @@ -673,6 +685,9 @@ int chrif_saveaccountreg2(dumb_ptr sd) { nullpo_retr(-1, sd); + if (!char_session) + return -1; + std::vector> repeat_10; for (size_t j = 0; j < sd->status.account_reg2_num; j++) { @@ -905,6 +920,9 @@ int chrif_recvgmaccounts(Session *s, const std::vector>& r */ int chrif_reloadGMdb(void) { + if (!char_session) + return -1; + Packet_Fixed<0x2af7> fixed_f7; send_fpacket<0x2af7, 2>(char_session, fixed_f7); diff --git a/src/map/intif.cpp b/src/map/intif.cpp index 3ca2130..543ec0b 100644 --- a/src/map/intif.cpp +++ b/src/map/intif.cpp @@ -53,6 +53,9 @@ // Message for all GMs on all map servers void intif_GMmessage(XString mes) { + if (!char_session) + return; + send_packet_repeatonly<0x3000, 4, 1>(char_session, mes); } @@ -61,6 +64,9 @@ void intif_wis_message(dumb_ptr sd, CharName nick, ZString mes { nullpo_retv(sd); + if (!char_session) + return; + Packet_Head<0x3001> head_01; head_01.from_char_name = sd->status_key.name; head_01.to_char_name = nick; @@ -75,6 +81,9 @@ void intif_wis_message(dumb_ptr sd, CharName nick, ZString mes static void intif_wis_replay(CharId id, int flag) { + if (!char_session) + return; + Packet_Fixed<0x3002> fixed_02; fixed_02.char_id = id; fixed_02.flag = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target @@ -87,6 +96,9 @@ void intif_wis_replay(CharId id, int flag) // The transmission of GM only Wisp/Page from server to inter-server void intif_wis_message_to_gm(CharName Wisp_name, GmLevel min_gm_level, ZString mes) { + if (!char_session) + return; + Packet_Head<0x3003> head_03; head_03.char_name = Wisp_name; head_03.min_gm_level = min_gm_level; @@ -101,6 +113,9 @@ void intif_wis_message_to_gm(CharName Wisp_name, GmLevel min_gm_level, ZString m void intif_saveaccountreg(dumb_ptr sd) { nullpo_retv(sd); + if (!char_session) + return; + assert (sd->status.account_reg_num < ACCOUNT_REG_NUM); Packet_Head<0x3004> head_04; @@ -119,6 +134,9 @@ void intif_request_accountreg(dumb_ptr sd) { nullpo_retv(sd); + if (!char_session) + return; + Packet_Fixed<0x3005> fixed_05; fixed_05.account_id = block_to_account(sd->bl_id); send_fpacket<0x3005, 6>(char_session, fixed_05); @@ -127,6 +145,9 @@ void intif_request_accountreg(dumb_ptr sd) // 倉庫データ要求 void intif_request_storage(AccountId account_id) { + if (!char_session) + return; + Packet_Fixed<0x3010> fixed_10; fixed_10.account_id = account_id; send_fpacket<0x3010, 6>(char_session, fixed_10); @@ -136,6 +157,9 @@ void intif_request_storage(AccountId account_id) void intif_send_storage(Storage *stor) { nullpo_retv(stor); + if (!char_session) + return; + Packet_Payload<0x3011> payload_11; payload_11.account_id = stor->account_id; payload_11.storage = *stor; @@ -147,6 +171,9 @@ void intif_create_party(dumb_ptr sd, PartyName name) { nullpo_retv(sd); + if (!char_session) + return; + Packet_Fixed<0x3020> fixed_20; fixed_20.account_id = sd->status_key.account_id; fixed_20.party_name = name; @@ -159,6 +186,9 @@ void intif_create_party(dumb_ptr sd, PartyName name) // パーティ情報要求 void intif_request_partyinfo(PartyId party_id) { + if (!char_session) + return; + Packet_Fixed<0x3021> fixed_21; fixed_21.party_id = party_id; send_fpacket<0x3021, 6>(char_session, fixed_21); @@ -167,6 +197,9 @@ void intif_request_partyinfo(PartyId party_id) // パーティ追加要求 void intif_party_addmember(PartyId party_id, AccountId account_id) { + if (!char_session) + return; + dumb_ptr sd; sd = map_id2sd(account_to_block(account_id)); if (sd != NULL) @@ -184,6 +217,9 @@ void intif_party_addmember(PartyId party_id, AccountId account_id) // パーティ設定変更 void intif_party_changeoption(PartyId party_id, AccountId account_id, int exp, int item) { + if (!char_session) + return; + Packet_Fixed<0x3023> fixed_23; fixed_23.party_id = party_id; fixed_23.account_id = account_id; @@ -195,6 +231,9 @@ void intif_party_changeoption(PartyId party_id, AccountId account_id, int exp, i // パーティ脱退要求 void intif_party_leave(PartyId party_id, AccountId account_id) { + if (!char_session) + return; + Packet_Fixed<0x3024> fixed_24; fixed_24.party_id = party_id; fixed_24.account_id = account_id; @@ -204,6 +243,9 @@ void intif_party_leave(PartyId party_id, AccountId account_id) // パーティ移動要求 void intif_party_changemap(dumb_ptr sd, int online) { + if (!char_session) + return; + if (sd != NULL) { Packet_Fixed<0x3025> fixed_25; @@ -219,6 +261,9 @@ void intif_party_changemap(dumb_ptr sd, int online) // パーティ会話送信 void intif_party_message(PartyId party_id, AccountId account_id, XString mes) { + if (!char_session) + return; + Packet_Head<0x3027> head_27; head_27.party_id = party_id; head_27.account_id = account_id; @@ -228,6 +273,9 @@ void intif_party_message(PartyId party_id, AccountId account_id, XString mes) // パーティ競合チェック要求 void intif_party_checkconflict(PartyId party_id, AccountId account_id, CharName nick) { + if (!char_session) + return; + Packet_Fixed<0x3028> fixed_28; fixed_28.party_id = party_id; fixed_28.account_id = account_id; -- cgit v1.2.3-60-g2f50