diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/login_sql/char_int.c | 181 | ||||
-rw-r--r-- | src/login_sql/login_int.c | 68 |
2 files changed, 138 insertions, 111 deletions
diff --git a/src/login_sql/char_int.c b/src/login_sql/char_int.c index be0de499c..30153737a 100644 --- a/src/login_sql/char_int.c +++ b/src/login_sql/char_int.c @@ -47,7 +47,10 @@ int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) { //------------------------------------------- // Request for account reg from char-server [Edit: Wizputer] //------------------------------------------- -void send_account_reg(int fd) { +int send_account_reg(int fd, int len) { + if (RFIFOREST(fd) < 19) + return -1; + int account_id = RFIFOL(fd,2); int i; @@ -119,12 +122,17 @@ void send_account_reg(int fd) { WFIFOSET(fd,51); } RFIFOSKIP(fd,19); + + return 0; } //---------------------------------------------------------- // Number of users in the world (connected char-server(s)) [Edit: Wizputer] //---------------------------------------------------------- -void number_world_users(int fd, int id) { +int number_world_users(int fd, int len, int id) { + if (len < 6) + return -1; + #ifdef DEBUG if (server[id].users != RFIFOL(fd,2)) printf("set number users %s : %d\n", server[id].name, RFIFOL(fd,2)); @@ -138,12 +146,17 @@ void number_world_users(int fd, int id) { sql_query(tmpsql,"number_world_users"); RFIFOSKIP(fd,6); + + return 0; } //----------------------------------------- // Email and Time request from char-server [Edit: Wizputer] //----------------------------------------- -void email_time_request(int fd, int id) { +int email_time_request(int fd, int len, int id) { + if (len < 6) + return -1; + int account_id=RFIFOL(fd,2); time_t connect_until_time = 0; char email[40] = ""; @@ -170,12 +183,17 @@ void email_time_request(int fd, int id) { WFIFOSET(fd,50); RFIFOSKIP(fd,6); + + return 0; } //-------------------------------- // Request to change email [Edit: Wizputer] //-------------------------------- -void change_account_email(int fd, int id, char ip[16]) { +int change_account_email(int fd, int len, int id, char ip[16]) { + if (len < 86) + return -1; + int acc = RFIFOL(fd,2); char actual_email[40], new_email[40]; @@ -218,12 +236,17 @@ void change_account_email(int fd, int id, char ip[16]) { } RFIFOSKIP(fd, 86); + + return 0; } //----------------------------------------------- // State change request from map server (By Yor) [Edit: Wizputer] //----------------------------------------------- -void status_change_request(int fd) { +int status_change_request(int fd, int len) { + if (len < 10) + return -1; + int acc = RFIFOL(fd,2), status = RFIFOL(fd,6); sprintf(tmpsql, "SELECT `state` FROM `%s` WHERE `%s` = '%d'", login_db, login_db_account_id, acc); @@ -246,12 +269,17 @@ void status_change_request(int fd) { } RFIFOSKIP(fd,10); + + return 0; } //-------------------------------------- // Ban request from map-server (By Yor) [Edit: Wizputer] //-------------------------------------- -void ban_request(int fd) { - int acc=RFIFOL(fd,2); +int ban_request(int fd, int len) { + if (len < 18) + return -1; + + int acc=RFIFOL(fd,2); struct tm *tmtime; time_t timestamp, tmptime; @@ -299,12 +327,17 @@ void ban_request(int fd) { } RFIFOSKIP(fd,18); + + return 0; } //----------------------------- // Change sex [Edit: Wizputer] //----------------------------- -void change_sex(int fd) { +int change_sex(int fd,int len) { + if (len < 6) + return -1; + int sex,acc=RFIFOL(fd,4); unsigned char buf[16]; @@ -327,12 +360,17 @@ void change_sex(int fd) { } RFIFOSKIP(fd,6); + + return 0; } //------------------------------- // Save Account Reg [Edit: Wizputer] //------------------------------- -void save_account_reg(int fd){ +int save_account_reg(int fd, int len){ + if (len < 4 || len < RFIFOW(fd,2)) + return -1; + int p,j,value,acc=RFIFOL(fd,4); char str[32]; char temp_str[32]; @@ -358,25 +396,60 @@ void save_account_reg(int fd){ #ifdef DEBUG printf("login: save account_reg (from char)\n"); #endif + + return 0; } //------------------------------------------------ // Recieve unban request from map-server (by Yor) [Edit: Wizputer] //------------------------------------------------ -void unban_request(int fd) { +int unban_request(int fd, int len) { + if (len < 6) + return -1; + int acc = RFIFOL(fd,2); sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d' AND `state`='6'", login_db,login_db_account_id,acc); sql_query(tmpsql,"unban_request"); RFIFOSKIP(fd,6); + + return 0; +} + +//--------------------------------------- +// Map-server Add Online User [Wizputer] +//--------------------------------------- +int map_add_online_user(int fd, int len) { + if (len < 6) + return -1; + + add_online_user(RFIFOL(fd,2)); + + RFIFOSKIP(fd,6); + + return 0; } +//--------------------------------------- +// Map-server Remove Online User [Wizputer] +//--------------------------------------- +int map_rem_online_user(int fd, int len) { + if (len < 6) + return -1; + + remove_online_user(RFIFOL(fd,2)); + + RFIFOSKIP(fd,6); + + return 0; +} + //----------------------------------------------------- // char-server packet parse [Edit: Wizputer] //----------------------------------------------------- int parse_fromchar(int fd){ - int id; + int id, len, res=0; unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; char ip[16]; @@ -404,80 +477,26 @@ int parse_fromchar(int fd){ delete_session(fd); return 0; } - - while(RFIFOREST(fd) >= 2) { + + len = RFIFOREST(fd); + + while(len >= 2 && res == 0) { #ifdef DEBUG_PACKETS printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); #endif switch (RFIFOW(fd,0)) { - case 0x2712: - if (RFIFOREST(fd) < 19) - return 0; - send_account_reg(fd); - break; - - case 0x2714: - if (RFIFOREST(fd) < 6) - return 0; - number_world_users(fd,id); - break; - - case 0x2716: - if (RFIFOREST(fd) < 6) - return 0; - email_time_request(fd, id); - break; - - case 0x2722: - if (RFIFOREST(fd) < 86) - return 0; - change_account_email(fd, id, ip); - break; - - case 0x2724: - if (RFIFOREST(fd) < 10) - return 0; - status_change_request(fd); - break; - - case 0x2725: - if (RFIFOREST(fd) < 18) - return 0; - ban_request(fd); - break; - - case 0x2727: - if (RFIFOREST(fd) < 6) - return 0; - change_sex(fd); - break; - - case 0x2728: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - save_account_reg(fd); - break; - - case 0x272a: - if (RFIFOREST(fd) < 6) - return 0; - unban_request(fd); - return 0; - - case 0x272b: // Set account_id to online [Wizputer] - if (RFIFOREST(fd) < 6) - return 0; - add_online_user(RFIFOL(fd,2)); - RFIFOSKIP(fd,6); - break; - - case 0x272c: // Set account_id to offline [Wizputer] - if (RFIFOREST(fd) < 6) - return 0; - remove_online_user(RFIFOL(fd,2)); - RFIFOSKIP(fd,6); - break; + case 0x2712: res = send_account_reg(fd,len); break; + case 0x2714: res = number_world_users(fd,len,id); break; + case 0x2716: res = email_time_request(fd,len,id); break; + case 0x2722: res = change_account_email(fd,len,id,ip); break; + case 0x2724: res = status_change_request(fd,len); break; + case 0x2725: res = ban_request(fd,len); break; + case 0x2727: res = change_sex(fd,len); break; + case 0x2728: res = save_account_reg(fd,len); break; + case 0x272a: res = unban_request(fd,len); break; + case 0x272b: res = map_add_online_user(fd,len); break; + case 0x272c: res = map_rem_online_user(fd,len); break; default: #ifdef DEBUG @@ -485,6 +504,8 @@ int parse_fromchar(int fd){ #endif session[fd]->eof = 1; } + + len = RFIFOREST(fd); } return 0; diff --git a/src/login_sql/login_int.c b/src/login_sql/login_int.c index 91dec834e..4a3220521 100644 --- a/src/login_sql/login_int.c +++ b/src/login_sql/login_int.c @@ -11,7 +11,10 @@ //---------------------- // Client requesting login [Edit: Wizputer] //---------------------- -void client_request_login(int fd,unsigned char *p ) { +int client_request_login(int fd,int len,unsigned char *p ) { + if(len < ((RFIFOW(fd, 0) ==0x64)?55:47)) + return -1; + struct mmo_account account; char t_uid[32]; int server_num = 0,result,i; @@ -151,12 +154,22 @@ void client_request_login(int fd,unsigned char *p ) { WFIFOSET(fd,23); RFIFOSKIP(fd,(RFIFOW(fd,0)==0x64)?55:47); + + return 0; } //------------------------------------------------------ // MD5 Key requested for encypted login [Edit: Wizputer //------------------------------------------------------ -void md5_key_request(int fd) { +int md5_key_request(int fd, int len) { + if (session[fd]->session_data) { + #ifdef DEBUG + printf("login: abnormal request of MD5 key (already opened session).\n"); + #endif + session[fd]->eof = 1; + return -1; + } + #ifdef DEBUG printf("Request Password key -%s\n",md5key); #endif @@ -166,12 +179,17 @@ void md5_key_request(int fd) { WFIFOW(fd,2)=4+md5keylen; memcpy(WFIFOP(fd,4),md5key,md5keylen); WFIFOSET(fd,WFIFOW(fd,2)); + + return 0; } //---------------------------------------------------- // Char-server requesting connection [Edit: Wizputer] //----------------------------------------------------- -void char_request_login(int fd, unsigned char *p) { +int char_request_login(int fd, int len, unsigned char *p) { + if(len<86) + return -1; + struct mmo_account account; unsigned char* server_name; char t_uid[32]; @@ -232,12 +250,14 @@ void char_request_login(int fd, unsigned char *p) { } RFIFOSKIP(fd, 86); + + return 0; } //--------------------------------------------- // Athena Version Info Request [Edit: Wizputer] //--------------------------------------------- -void request_athena_info(int fd) { +int request_athena_info(int fd, int len) { #ifdef DEBUG printf ("Athena version check...\n"); #endif @@ -252,6 +272,8 @@ void request_athena_info(int fd) { WFIFOW(fd,8)=ATHENA_MOD_VERSION; WFIFOSET(fd,10); RFIFOSKIP(fd,2); + + return 0; } //---------------------------------------------------------------------------------------- @@ -259,6 +281,7 @@ void request_athena_info(int fd) { //---------------------------------------------------------------------------------------- int parse_login(int fd) { char ip[16]; + int len,res=0; unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); @@ -309,8 +332,10 @@ int parse_login(int fd) { delete_session(fd); return 0; } - - while(RFIFOREST(fd)>=2){ + + len = RFIFOREST(fd); + + while(len>=2 && res == 0){ #ifdef DEBUG_PACKETS printf("parse_login : %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); #endif @@ -329,31 +354,10 @@ int parse_login(int fd) { break; case 0x64: - case 0x01dd: - if(RFIFOREST(fd)< ((RFIFOW(fd, 0) ==0x64)?55:47)) - return 0; - client_request_login(fd, p); - break; - case 0x01db: - if (session[fd]->session_data) { - #ifdef DEBUG - printf("login: abnormal request of MD5 key (already opened session).\n"); - #endif - session[fd]->eof = 1; - return 0; - } - md5_key_request(fd); - break; - - case 0x2710: - if(RFIFOREST(fd)<86) - return 0; - char_request_login(fd,p); - break; - - case 0x7530: - request_athena_info(fd); - break; + case 0x01dd: res = client_request_login(fd,len,p); break; + case 0x01db: res = md5_key_request(fd,len); break; + case 0x2710: res = char_request_login(fd,len,p); break; + case 0x7530: res = request_athena_info(fd,len); break; case 0x7532: default: @@ -363,6 +367,8 @@ int parse_login(int fd) { session[fd]->eof = 1; return 0; } + + len = RFIFOREST(fd); } return 0; |