From e4f1bb413aa609b173707b9e5d960ae0476dab61 Mon Sep 17 00:00:00 2001 From: lordttseven Date: Sat, 18 Feb 2012 22:05:21 +0000 Subject: * adjusted socket_max_client_packet to a more accurate (if guessed) value to prevent undefined client behavior (may only affect more recent clients?) + added a workaround for too large ZC_SKILLINFO_LIST packets resulting from all_skill group permission by sending excess skills one by one (bugreport:5348 and bugreport:5349) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15609 54d463be-8e91-2dee-dedb-b68131a5f0ec --- conf/packet_athena.conf | 7 ++++--- src/common/socket.c | 3 ++- src/common/socket.h | 1 + src/map/clif.c | 14 ++++++++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/conf/packet_athena.conf b/conf/packet_athena.conf index 0741ac013..e1ce86a46 100644 --- a/conf/packet_athena.conf +++ b/conf/packet_athena.conf @@ -8,12 +8,13 @@ debug: no // How long can a socket stall before closing the connection (in seconds) stall_time: 60 -// Maximum allowed size for clients packets in bytes (default: 24576). +// Maximum allowed size for clients packets in bytes (default: 8192). // NOTE: To reduce the size of reported packets, lower the values of defines, which // have been customized, such as MAX_STORAGE, MAX_GUILD_STORAGE or MAX_CART. // NOTE: Do not modify this setting, unless the client has been modified to support -// larger packets. The client will crash, when it receives larger packets. -socket_max_client_packet: 24576 +// larger packets. The client will crash, when it receives larger packets, +// or worse, show undefined behavior. +socket_max_client_packet: 8192 //----- IP Rules Settings ----- diff --git a/src/common/socket.c b/src/common/socket.c index 592755d5a..fd9534c3b 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -219,7 +219,8 @@ int naddr_ = 0; // # of ip addresses // Maximum packet size in bytes, which the client is able to handle. // Larger packets cause a buffer overflow and stack corruption. -static size_t socket_max_client_packet = 24576; +// TODO: This value is based on pure observation with newer clients. Replace with the actual buffer size if we ever get our hands on it. +static size_t socket_max_client_packet = 8192; // initial recv buffer size (this will also be the max. size) // biggest known packet: S 0153 .w .?B -> 24x24 256 color .bmp (0153 + len.w + 1618/1654/1756 bytes) diff --git a/src/common/socket.h b/src/common/socket.h index a5d519d0e..b02e83d36 100644 --- a/src/common/socket.h +++ b/src/common/socket.h @@ -94,6 +94,7 @@ struct socket_data void* session_data; // stores application-specific data related to the session }; +static size_t socket_max_client_packet; // Data prototype declaration diff --git a/src/map/clif.c b/src/map/clif.c index 2c6b3e742..007df2928 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -4534,6 +4534,10 @@ void clif_skillinfoblock(struct map_session_data *sd) { if( (id = sd->status.skill[i].id) != 0 ) { + // workaround for bugreport:5348 + if (len + 37 > socket_max_client_packet) + break; + WFIFOW(fd,len) = id; WFIFOL(fd,len+2) = skill_get_inf(id); WFIFOW(fd,len+6) = sd->status.skill[i].lv; @@ -4549,6 +4553,16 @@ void clif_skillinfoblock(struct map_session_data *sd) } WFIFOW(fd,2)=len; WFIFOSET(fd,len); + + // workaround for bugreport:5348; send the remaining skills one by one to bypass packet size limit + for ( ; i < MAX_SKILL; i++) + { + if( (id = sd->status.skill[i].id) != 0 ) + { + clif_addskill(sd, id); + clif_skillinfo(sd, id, 0); + } + } } /** * Server tells client 'sd' to add skill of id 'id' to it's skill tree (e.g. with Ice Falcion item) -- cgit v1.2.3-60-g2f50