Skip to content

Commit

Permalink
Fix crash on unknown member access on Client
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinEady committed Jun 15, 2022
1 parent 78a60be commit f5765f1
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 48 deletions.
1 change: 1 addition & 0 deletions pol-core/pol/network/client.h
Expand Up @@ -274,6 +274,7 @@ class Client : private ThreadedClient
}

Bscript::BObjectImp* set_script_member_id( const int id, int value );
Bscript::BObjectImp* get_script_member_id( const int id );

protected:
void PreDelete();
Expand Down
105 changes: 57 additions & 48 deletions pol-core/pol/uoscrobj.cpp
Expand Up @@ -4621,54 +4621,10 @@ BObjectRef EClientRefObjImp::get_member_id( const int id )
if ( ( !obj_.exists() ) || ( !obj_->isConnected() ) )
return BObjectRef( new BError( "Client not ready or disconnected" ) );

switch ( id )
{
case MBR_ACCTNAME:
if ( obj_->acct != nullptr )
return BObjectRef( new String( obj_->acct->name() ) );
return BObjectRef( new BError( "Not attached to an account" ) );
break;
case MBR_IP:
return BObjectRef( new String( obj_->ipaddrAsString() ) );
break;
case MBR_CLIENTVERSION:
return BObjectRef( new String( obj_->getversion() ) );
break;
case MBR_CLIENTVERSIONDETAIL:
{
std::unique_ptr<BStruct> info( new BStruct );
Network::VersionDetailStruct version = obj_->getversiondetail();
info->addMember( "major", new BLong( version.major ) );
info->addMember( "minor", new BLong( version.minor ) );
info->addMember( "rev", new BLong( version.rev ) );
info->addMember( "patch", new BLong( version.patch ) );
return BObjectRef( info.release() );
}
break;
case MBR_CLIENTINFO:
return BObjectRef( obj_->getclientinfo() );
break;
case MBR_CLIENTTYPE:
return BObjectRef( new BLong( obj_->ClientType ) );
break;
case MBR_UO_EXPANSION_CLIENT:
return BObjectRef( new BLong( obj_->UOExpansionFlagClient ) );
break;
case MBR_LAST_ACTIVITY_AT:
return BObjectRef( new BLong( static_cast<s32>( obj_->last_activity_at() ) ) );
break;
case MBR_LAST_PACKET_AT:
return BObjectRef( new BLong( static_cast<s32>( obj_->last_packet_at() ) ) );
break;
case MBR_PORT:
return BObjectRef( new BLong( obj_->listen_port ) );
break;
case MBR_DISABLE_INACTIVITY_TIMEOUT:
return BObjectRef( new BLong( obj_->disable_inactivity_timeout() ) );
break;
}

return base::get_member_id( id );
BObjectImp* result = obj_->get_script_member_id( id );
if ( result != nullptr )
return BObjectRef( result );
return BObjectRef( UninitObject::create() );
}

BObjectRef EClientRefObjImp::get_member( const char* membername )
Expand Down Expand Up @@ -4867,6 +4823,59 @@ BObjectImp* Client::set_script_member_id( const int id, int value )
return nullptr;
}
}

BObjectImp* Client::get_script_member_id( const int id )
{
switch ( id )
{
case MBR_ACCTNAME:
if ( acct != nullptr )
return new String( acct->name() );
return new BError( "Not attached to an account" );
break;
case MBR_IP:
return new String( ipaddrAsString() );
break;
case MBR_CLIENTVERSION:
return new String( getversion() );
break;
case MBR_CLIENTVERSIONDETAIL:
{
std::unique_ptr<BStruct> info( new BStruct );
Network::VersionDetailStruct version = getversiondetail();
info->addMember( "major", new BLong( version.major ) );
info->addMember( "minor", new BLong( version.minor ) );
info->addMember( "rev", new BLong( version.rev ) );
info->addMember( "patch", new BLong( version.patch ) );
return info.release();
}
break;
case MBR_CLIENTINFO:
return getclientinfo();
break;
case MBR_CLIENTTYPE:
return new BLong( ClientType );
break;
case MBR_UO_EXPANSION_CLIENT:
return new BLong( UOExpansionFlagClient );
break;
case MBR_LAST_ACTIVITY_AT:
return new BLong( static_cast<s32>( last_activity_at() ) );
break;
case MBR_LAST_PACKET_AT:
return new BLong( static_cast<s32>( last_packet_at() ) );
break;
case MBR_PORT:
return new BLong( listen_port );
break;
case MBR_DISABLE_INACTIVITY_TIMEOUT:
return new BLong( disable_inactivity_timeout() );
break;
}

return nullptr;
}

} // namespace Network

namespace Core
Expand Down
11 changes: 11 additions & 0 deletions testsuite/pol/testpkgs/client/test_client.src
Expand Up @@ -22,6 +22,17 @@ program chartests()
endif
endprogram

exported function test_client_properties()
if (char.client.acctname != "testclient0")
return ret_error("Incorrect account name on char 1, expected 'testclient0");
elseif (char2.client.acctname != "testclient1")
return ret_error("Incorrect account name on char 2, expected 'testclient1");
elseif (char.client.unknownprop != Unpack("u"))
return ret_error("Expected char.client.unknownprop to be uninit object, got " + char.client.unknownprop);
endif
return 1;
endfunction

exported function say_something()
Clear_Event_Queue();
clientcon.sendevent(struct{todo:="speech", arg:="Hello Test", id:=0});
Expand Down

0 comments on commit f5765f1

Please sign in to comment.