diff options
author | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-11-29 20:54:55 +0000 |
---|---|---|
committer | skotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2006-11-29 20:54:55 +0000 |
commit | b6f7909401cb3d5bd9a79bbec03a89527efc9029 (patch) | |
tree | cffce3bdb90306fc5fcdf82f44b42f2155e5ecec /src/map/intif.c | |
parent | c2e9dc776639a58be9c073e4deeabb231d326297 (diff) | |
download | hercules-b6f7909401cb3d5bd9a79bbec03a89527efc9029.tar.gz hercules-b6f7909401cb3d5bd9a79bbec03a89527efc9029.tar.bz2 hercules-b6f7909401cb3d5bd9a79bbec03a89527efc9029.tar.xz hercules-b6f7909401cb3d5bd9a79bbec03a89527efc9029.zip |
- Added a missing map_quit in clif_parse which was the real reason for the crashes.
- Therefore, removed the session valid checks from intif.c
- Thanks for Flavio for figuring out how to reproduce the crash. And unthanks to me for introducing it on the first place D:
- Note: Every connection before being closed and free'd will set eof to 1 and invoke the parse function (clif_parse for players), and since this is the last invocation, it is clif_parse's job to do any cleanup necessary. The missing map_quit what did was to leave the player pointer reference in different db's, which lead to a dangling pointer! Which obviously leads to no good. The map server's code should always ensure that session[sd->fd]->session_data == sd ALL the time (except when sd->fd is 0).
- Finally, not writing any of this on the txt changelog file so Flavio can have the glory of the bugfix :B
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@9368 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/intif.c')
-rw-r--r-- | src/map/intif.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/src/map/intif.c b/src/map/intif.c index 40cd52136..b1a147d0f 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -934,8 +934,7 @@ int intif_parse_Registers(int fd) { int *qty; RFIFOHEAD(fd); - if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL || - !session_isValid(sd->fd)) // Invalid session + if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL) return 1; if (RFIFOB(fd,12) == 3 && sd->status.char_id != RFIFOL(fd,8)) @@ -992,9 +991,8 @@ int intif_parse_LoadStorage(int fd) { return 1; } - if (sd->state.finalsave || //Player is already scheduled to leave the server. - !session_isValid(sd->fd)) // Invalid session - return 1; + if (sd->state.finalsave) + return 1; //Player is already scheduled to leave the server. stor = account2storage( RFIFOL(fd,4)); @@ -1049,9 +1047,7 @@ int intif_parse_LoadGuildStorage(int fd) if(battle_config.error_log) ShowError("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4)); return 1; - } else if(!session_isValid(sd->fd)) - return 1; // Invalid session - + } gstor=guild2storage(guild_id); if(!gstor) { if(battle_config.error_log) @@ -1424,8 +1420,7 @@ int intif_parse_RenamePetOk(int fd) struct map_session_data *sd = NULL; RFIFOHEAD(fd); if((sd=map_id2sd(RFIFOL(fd,2)))==NULL || - sd->status.char_id != RFIFOL(fd,6) || - !session_isValid(sd->fd)) // Invalid session + sd->status.char_id != RFIFOL(fd,6)) return 0; if (RFIFOB(fd,10) == 0) { clif_displaymessage(sd->fd, msg_txt(280)); // You cannot use this name for your pet. |