Fixed a few possible crashes (#5202)

Fixes #5196

Thanks to @ecdarreola
This commit is contained in:
Lemongrass3110 2020-07-13 12:07:46 +02:00 committed by GitHub
parent afdd8d3897
commit f9974170c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 47 deletions

View File

@ -1625,7 +1625,7 @@ void socket_init(void)
bool session_isValid(int fd)
{
return ( fd > 0 && fd < MAXCONN && session[fd] != NULL );
return ( fd > 0 && fd < MAXCONN && session[fd] != nullptr );
}
bool session_isActive(int fd)

View File

@ -380,9 +380,10 @@ static int clif_send_sub(struct block_list *bl, va_list ap)
nullpo_ret(bl);
nullpo_ret(sd = (struct map_session_data *)bl);
fd = sd->fd;
if (!fd) //Don't send to disconnected clients.
// Don't send to disconnected clients.
if( !session_isActive( fd = sd->fd ) ){
return 0;
}
buf = va_arg(ap,unsigned char*);
len = va_arg(ap,int);
@ -414,9 +415,6 @@ static int clif_send_sub(struct block_list *bl, va_list ap)
break;
}
if (session[fd] == NULL)
return 0;
/* unless visible, hold it here */
if (!battle_config.update_enemy_position && clif_ally_only && !sd->special_state.intravision &&
!sd->sc.data[SC_INTRAVISION] && battle_check_target(src_bl,&sd->bl,BCT_ENEMY) > 0)
@ -462,22 +460,23 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
case ALL_CLIENT: //All player clients.
iter = mapit_getallusers();
while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL ){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd, 0), buf, len);
WFIFOSET(tsd->fd, len);
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( session_isActive( fd = tsd->fd ) ){
WFIFOHEAD( fd, len );
memcpy( WFIFOP( fd, 0 ), buf, len );
WFIFOSET( fd, len );
}
}
mapit_free(iter);
break;
case ALL_SAMEMAP: //All players on the same map
iter = mapit_getallusers();
while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
{
if( bl->m == tsd->bl.m ){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd,0), buf, len);
WFIFOSET(tsd->fd,len);
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( bl->m == tsd->bl.m && session_isActive( fd = tsd->fd ) ){
WFIFOHEAD( fd, len );
memcpy( WFIFOP( fd, 0 ), buf, len );
WFIFOSET( fd, len );
}
}
mapit_free(iter);
@ -511,7 +510,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
for(i = 0; i < cd->users; i++) {
if (type == CHAT_WOS && cd->usersd[i] == sd)
continue;
if ((fd=cd->usersd[i]->fd) >0 && session[fd]){ // Added check to see if session exists [PoW]
if( session_isActive( fd = cd->usersd[i]->fd ) ){
WFIFOHEAD(fd,len);
memcpy(WFIFOP(fd,0), buf, len);
WFIFOSET(fd,len);
@ -538,7 +537,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
if( (sd = p->data[i].sd) == NULL )
continue;
if( !(fd=sd->fd) )
if( !session_isActive( fd = sd->fd ) )
continue;
if( sd->bl.id == bl->id && (type == PARTY_WOS || type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS) )
@ -558,12 +557,11 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
break;
iter = mapit_getallusers();
while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
{
if( tsd->partyspy == p->party.party_id ){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd,0), buf, len);
WFIFOSET(tsd->fd,len);
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( tsd->partyspy == p->party.party_id && session_isActive( fd = tsd->fd ) ){
WFIFOHEAD( fd, len );
memcpy( WFIFOP( fd, 0 ), buf, len );
WFIFOSET( tsd->fd, len );
}
}
mapit_free(iter);
@ -575,21 +573,20 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
if (!sd || !sd->duel_group) break; //Invalid usage.
iter = mapit_getallusers();
while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
{
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( type == DUEL_WOS && bl->id == tsd->bl.id )
continue;
if( sd->duel_group == tsd->duel_group ){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd,0), buf, len);
WFIFOSET(tsd->fd,len);
if( sd->duel_group == tsd->duel_group && session_isActive( fd = tsd->fd ) ){
WFIFOHEAD( fd, len );
memcpy( WFIFOP( fd, 0 ), buf, len );
WFIFOSET( fd, len );
}
}
mapit_free(iter);
break;
case SELF:
if (sd && (fd=sd->fd)) {
if( sd && session_isActive( fd=sd->fd ) ){
WFIFOHEAD(fd,len);
memcpy(WFIFOP(fd,0), buf, len);
WFIFOSET(fd,len);
@ -613,9 +610,8 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
if (g) {
for(i = 0; i < g->max_member; i++) {
if( (sd = g->member[i].sd) != NULL )
{
if( !(fd=sd->fd) )
if( (sd = g->member[i].sd) != nullptr ){
if( !session_isActive( fd = sd->fd ) )
continue;
if( type == GUILD_NOBG && sd->bg_id )
@ -639,12 +635,11 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
break;
iter = mapit_getallusers();
while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
{
if( tsd->guildspy == g->guild_id ){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd,0), buf, len);
WFIFOSET(tsd->fd,len);
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( tsd->guildspy == g->guild_id && session_isActive( fd = tsd->fd ) ){
WFIFOHEAD( fd, len );
memcpy( WFIFOP( fd, 0 ), buf, len );
WFIFOSET( fd, len );
}
}
mapit_free(iter);
@ -664,7 +659,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
if( sd && sd->bg_id > 0 && (bg = util::umap_find(bg_team_db, sd->bg_id)))
{
for (const auto &member : bg->members) {
if((sd = member.sd) == nullptr || (fd = sd->fd) == 0)
if( ( sd = member.sd ) == nullptr || !session_isActive( fd = sd->fd ) )
continue;
if(sd->bl.id == bl->id && (type == BG_WOS || type == BG_SAMEMAP_WOS || type == BG_AREA_WOS) )
continue;
@ -683,7 +678,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
struct clan* clan = sd->clan;
for( i = 0; i < clan->max_member; i++ ){
if( ( sd = clan->members[i] ) == NULL || !(fd = sd->fd) ){
if( ( sd = clan->members[i] ) == nullptr || !session_isActive( fd = sd->fd ) ){
continue;
}
@ -696,11 +691,11 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
break;
iter = mapit_getallusers();
while ((tsd = (TBL_PC*)mapit_next(iter)) != NULL){
if (tsd->clanspy == clan->id){
WFIFOHEAD(tsd->fd, len);
memcpy(WFIFOP(tsd->fd, 0), buf, len);
WFIFOSET(tsd->fd, len);
while( ( tsd = (map_session_data*)mapit_next( iter ) ) != nullptr ){
if( tsd->clanspy == clan->id && session_isActive( fd = tsd->fd ) ){
WFIFOHEAD(fd, len);
memcpy(WFIFOP(fd, 0), buf, len);
WFIFOSET(fd, len);
}
}
mapit_free(iter);