fix(core): Handles a rare NPE with LoginTimer (#508)

This commit is contained in:
Kamron Batman 2021-02-11 23:47:02 -08:00 committed by GitHub
parent b8a625dcd3
commit 952a3e0265
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 118 additions and 127 deletions

View file

@ -17,7 +17,6 @@ using System.Buffers.Binary;
using System.IO;
using System.Runtime.CompilerServices;
using System.Text;
using Server;
using Server.Network;
using Server.Text;

View file

@ -20,7 +20,6 @@ using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using Server;
using Server.Network;
using Server.Text;

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Text;
using Server.Network;
using Server.Text;

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;

View file

@ -1,5 +1,3 @@
using System;
namespace Server.Network
{
public delegate void OnPacketReceive(NetState state, CircularBufferReader reader, ref int packetLength);

View file

@ -57,9 +57,12 @@ namespace Server.Network
public static void CreateCharacter(NetState state, CircularBufferReader reader, ref int packetLength)
{
reader.Seek(9, SeekOrigin.Current);
/*
var unk1 = reader.ReadInt32();
var unk2 = reader.ReadInt32();
int unk3 = reader.ReadByte();
*/
var name = reader.ReadAscii(30);
reader.Seek(2, SeekOrigin.Current);
@ -113,8 +116,11 @@ namespace Server.Network
int hairHuef = reader.ReadInt16();
reader.ReadByte();
int cityIndex = reader.ReadByte();
reader.Seek(8, SeekOrigin.Current);
/*
var charSlot = reader.ReadInt32();
var clientIP = reader.ReadInt32();
*/
int shirtHue = reader.ReadInt16();
int pantsHue = reader.ReadInt16();
@ -141,64 +147,63 @@ namespace Server.Network
if (info == null || a == null || cityIndex < 0 || cityIndex >= info.Length)
{
state.Disconnect("Invalid city selected during character creation.");
return;
}
// Check if anyone is using this account
for (var i = 0; i < a.Length; ++i)
{
var check = a[i];
if (check != null && check.Map != Map.Internal)
{
state.WriteConsole("Account in use");
state.SendPopupMessage(PMMessage.CharInWorld);
return;
}
}
state.Flags = (ClientFlags)flags;
var args = new CharacterCreatedEventArgs(
state,
a,
name,
female,
hue,
str,
dex,
intl,
info[cityIndex],
skills,
shirtHue,
pantsHue,
hairVal,
hairHue,
hairValf,
hairHuef,
prof,
race
);
state.SendClientVersionRequest();
state.BlockAllPackets = true;
EventSink.InvokeCharacterCreated(args);
var m = args.Mobile;
if (m != null)
{
state.Mobile = m;
m.NetState = state;
new LoginTimer(state, m).Start();
}
else
{
// Check if anyone is using this account
for (var i = 0; i < a.Length; ++i)
{
var check = a[i];
if (check != null && check.Map != Map.Internal)
{
state.WriteConsole("Account in use");
state.SendPopupMessage(PMMessage.CharInWorld);
return;
}
}
state.Flags = (ClientFlags)flags;
var args = new CharacterCreatedEventArgs(
state,
a,
name,
female,
hue,
str,
dex,
intl,
info[cityIndex],
skills,
shirtHue,
pantsHue,
hairVal,
hairHue,
hairValf,
hairHuef,
prof,
race
);
state.SendClientVersionRequest();
state.BlockAllPackets = true;
EventSink.InvokeCharacterCreated(args);
var m = args.Mobile;
if (m != null)
{
state.Mobile = m;
m.NetState = state;
new LoginTimer(state, m).Start();
}
else
{
state.BlockAllPackets = false;
state.Disconnect("Character creation blocked.");
}
state.BlockAllPackets = false;
state.Disconnect("Character creation blocked.");
}
}
@ -239,9 +244,9 @@ namespace Server.Network
public static void PlayCharacter(NetState state, CircularBufferReader reader, ref int packetLength)
{
reader.ReadInt32(); // 0xEDEDEDED
reader.Seek(4, SeekOrigin.Current); // 0xEDEDEDED
var name = reader.ReadAscii(30);
reader.Seek(30, SeekOrigin.Current); // var name = reader.ReadAscii(30);
reader.Seek(2, SeekOrigin.Current);
@ -250,50 +255,49 @@ namespace Server.Network
reader.Seek(24, SeekOrigin.Current);
var charSlot = reader.ReadInt32();
var clientIP = reader.ReadInt32();
reader.Seek(4, SeekOrigin.Current); // var clientIP = reader.ReadInt32();
var a = state.Account;
if (a == null || charSlot < 0 || charSlot >= a.Length)
{
state.Disconnect("Invalid character slot selected.");
return;
}
else
var m = a[charSlot];
// Check if anyone is using this account
for (var i = 0; i < a.Length; ++i)
{
var m = a[charSlot];
var check = a[i];
// Check if anyone is using this account
for (var i = 0; i < a.Length; ++i)
if (check != null && check.Map != Map.Internal && check != m)
{
var check = a[i];
if (check != null && check.Map != Map.Internal && check != m)
{
state.WriteConsole("Account in use");
state.SendPopupMessage(PMMessage.CharInWorld);
return;
}
}
if (m == null)
{
state.Disconnect("Empty character slot selected.");
state.WriteConsole("Account in use");
state.SendPopupMessage(PMMessage.CharInWorld);
return;
}
m.NetState?.Disconnect("Character selected for a player already logged in.");
state.SendClientVersionRequest();
state.BlockAllPackets = true;
state.Flags = (ClientFlags)flags;
state.Mobile = m;
m.NetState = state;
new LoginTimer(state, m).Start();
}
if (m == null)
{
state.Disconnect("Empty character slot selected.");
return;
}
m.NetState?.Disconnect("Character selected for a player already logged in.");
state.SendClientVersionRequest();
state.BlockAllPackets = true;
state.Flags = (ClientFlags)flags;
state.Mobile = m;
m.NetState = state;
new LoginTimer(state, m).Start();
}
public static void DoLogin(this NetState state, Mobile m)
@ -523,29 +527,39 @@ namespace Server.Network
private class LoginTimer : Timer
{
private readonly Mobile m_Mobile;
private readonly NetState m_State;
private readonly Mobile _mobile;
private readonly NetState _state;
public LoginTimer(NetState state, Mobile m) : base(TimeSpan.FromSeconds(1.0), TimeSpan.FromSeconds(1.0))
{
m_State = state;
m_Mobile = m;
_state = state;
_mobile = m;
}
protected override void OnTick()
{
if (m_State == null)
if (_state != null)
{
Stop();
return;
if (_state.Account == null)
{
_state.Disconnect("Account was deleted during the login process.");
}
else if (_mobile == null)
{
_state.Disconnect("Player was deleted during the login process.");
}
else if (_state.Version != null)
{
_state.BlockAllPackets = false;
DoLogin(_state, _mobile);
}
else // Waiting to receive the client version before we continue the login process
{
return;
}
}
if (m_State.Version != null)
{
m_State.BlockAllPackets = false;
DoLogin(m_State, m_Mobile);
Stop();
}
Stop();
}
}
}

View file

@ -13,7 +13,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*************************************************************************/
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

View file

@ -20,7 +20,6 @@ using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using Server.Exceptions;
namespace Server.Network
{

View file

@ -1,6 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Server.Network;

View file

@ -17,7 +17,6 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Server.Diagnostics;
namespace Server

View file

@ -1,8 +1,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Server;
using Server.Collections;
using Server.Items;
using Server.Multis;
using Server.Network;

View file

@ -403,10 +403,8 @@ namespace Server.Misc
Console.WriteLine("Login: {0}: Past IP limit threshold", e.State);
using (var op = new StreamWriter("ipLimits.log", true))
{
op.WriteLine("{0}\tPast IP limit threshold\t{1}", e.State, DateTime.UtcNow);
}
using var op = new StreamWriter("ipLimits.log", true);
op.WriteLine("{0}\tPast IP limit threshold\t{1}", e.State, DateTime.UtcNow);
return;
}
@ -414,7 +412,7 @@ namespace Server.Misc
var un = e.Username;
var pw = e.Password;
if (!(Accounts.GetAccount(un) is Account acct))
if (Accounts.GetAccount(un) is not Account acct)
{
e.Accepted = false;
}

View file

@ -15,7 +15,6 @@
using System;
using System.Security.Cryptography;
using System.Text;
using Server.Text;
namespace Server.Accounting.Security

View file

@ -13,7 +13,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*************************************************************************/
using System;
using System.Buffers;
using System.IO;
using Server.Network;

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Server.ContextMenus;
using Server.Engines.PartySystem;
using Server.Engines.Quests.Doom;

View file

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Mobiles;
using Server.Spells;
namespace Server.Items

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Server.Json;
using Server.Mobiles;

View file

@ -1,9 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using Server.Collections;
using Server.Items;
using Server.Multis.Boats;
using Server.Network;