Bug fix : 6x try / catch to resolve crashes caused by GemCard, etc., ver. 3.1.1805

This commit is contained in:
Milan Hanajik 2021-11-10 13:20:39 +01:00
parent 44fc7b92fd
commit 335fce3e39
6 changed files with 127 additions and 73 deletions

View File

@ -199,7 +199,8 @@ namespace GemCard
{ {
Disconnect(DISCONNECT.Unpower); Disconnect(DISCONNECT.Unpower);
ReleaseContext(); try { ReleaseContext(); }
catch { }
} }
#region ICard Members #region ICard Members
@ -215,66 +216,73 @@ namespace GemCard
/// <returns>A string array of the readers</returns> /// <returns>A string array of the readers</returns>
public override string[] ListReaders() public override string[] ListReaders()
{ {
EstablishContext(SCOPE.User); try
{
EstablishContext(SCOPE.User);
string[] sListReaders = null; string[] sListReaders = null;
UInt32 pchReaders = 0; UInt32 pchReaders = 0;
IntPtr szListReaders = IntPtr.Zero; IntPtr szListReaders = IntPtr.Zero;
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders); m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0) if (m_nLastError == 0)
{ {
szListReaders = Marshal.AllocHGlobal((int) pchReaders); szListReaders = Marshal.AllocHGlobal((int)pchReaders);
m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders); m_nLastError = SCardListReaders(m_hContext, null, szListReaders, out pchReaders);
if (m_nLastError == 0) if (m_nLastError == 0)
{ {
char[] caReadersData = new char[pchReaders]; char[] caReadersData = new char[pchReaders];
int nbReaders = 0; int nbReaders = 0;
for (int nI = 0; nI < pchReaders; nI++) for (int nI = 0; nI < pchReaders; nI++)
{ {
caReadersData[nI] = (char) Marshal.ReadByte(szListReaders, nI); caReadersData[nI] = (char)Marshal.ReadByte(szListReaders, nI);
if (caReadersData[nI] == 0) if (caReadersData[nI] == 0)
nbReaders++; nbReaders++;
} }
// Remove last 0 // Remove last 0
--nbReaders; --nbReaders;
if (nbReaders != 0) if (nbReaders != 0)
{ {
sListReaders = new string[nbReaders]; sListReaders = new string[nbReaders];
char[] caReader = new char[pchReaders]; char[] caReader = new char[pchReaders];
int nIdx = 0; int nIdx = 0;
int nIdy = 0; int nIdy = 0;
int nIdz = 0; int nIdz = 0;
// Get the nJ string from the multi-string // Get the nJ string from the multi-string
while(nIdx < pchReaders - 1) while (nIdx < pchReaders - 1)
{ {
caReader[nIdy] = caReadersData[nIdx]; caReader[nIdy] = caReadersData[nIdx];
if (caReader[nIdy] == 0) if (caReader[nIdy] == 0)
{ {
sListReaders[nIdz] = new string(caReader, 0, nIdy); sListReaders[nIdz] = new string(caReader, 0, nIdy);
++nIdz; ++nIdz;
nIdy = 0; nIdy = 0;
caReader = new char[pchReaders]; caReader = new char[pchReaders];
} }
else else
++nIdy; ++nIdy;
++nIdx; ++nIdx;
} }
} }
} }
Marshal.FreeHGlobal(szListReaders); Marshal.FreeHGlobal(szListReaders);
} }
ReleaseContext(); ReleaseContext();
return sListReaders; return sListReaders;
}
catch
{
return new string[0];
}
} }
/// <summary> /// <summary>

View File

@ -4,6 +4,7 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using log4net;
using Common; using Common;
using GemCard; using GemCard;
using SharedDatabase.Entities; using SharedDatabase.Entities;
@ -17,6 +18,8 @@ namespace SharedDatabase.Forms
/// </summary> /// </summary>
public partial class LoginDlg : Form public partial class LoginDlg : Form
{ {
private static readonly ILog log = LogManager.GetLogger(typeof(LoginDlg));
/// Public readonly /// Public readonly
public string UserName { get { return user; } } public string UserName { get { return user; } }
@ -111,10 +114,16 @@ namespace SharedDatabase.Forms
string[] cardReaders = card.ListReaders(); string[] cardReaders = card.ListReaders();
if (cardReaders != null) if (cardReaders != null)
{ {
foreach (var crd in cardReaders)
{
log.WarnFormat("SMART card reader found: {0}", crd);
}
foreach (var crd in cardReaders) foreach (var crd in cardReaders)
{ {
if (crd.Contains("NFC")) if (crd.Contains("NFC"))
{ {
log.ErrorFormat("SMART card reader selected: {0}", crd);
smartCardReader = crd; /// NFC smart card reader detected smartCardReader = crd; /// NFC smart card reader detected
break; break;
} }

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number // Build Number
// Revision // Revision
// //
[assembly: AssemblyVersion("3.1.1801.0")] [assembly: AssemblyVersion("3.1.1805.0")]
[assembly: AssemblyFileVersion("3.1.1801.0")] [assembly: AssemblyFileVersion("3.1.1805.0")]

View File

@ -4,6 +4,7 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Windows.Forms; using System.Windows.Forms;
using log4net;
using Common; using Common;
using GemCard; using GemCard;
using TBF.Resources; using TBF.Resources;
@ -17,6 +18,8 @@ namespace TBF.UI.Shared
/// </summary> /// </summary>
public partial class LoginDlgWithBenchSelection : Form public partial class LoginDlgWithBenchSelection : Form
{ {
private static readonly ILog log = LogManager.GetLogger(typeof(LoginDlgWithBenchSelection));
public const string UseTheTagPassword = "UseTheTag0293578"; public const string UseTheTagPassword = "UseTheTag0293578";
/// Private fields /// Private fields
@ -108,10 +111,16 @@ namespace TBF.UI.Shared
string[] cardReaders = card.ListReaders(); string[] cardReaders = card.ListReaders();
if (cardReaders != null) if (cardReaders != null)
{ {
foreach (var crd in cardReaders)
{
log.WarnFormat("SMART card reader found: {0}", crd);
}
foreach (var crd in cardReaders) foreach (var crd in cardReaders)
{ {
if (crd.Contains("NFC")) if (crd.Contains("NFC"))
{ {
log.ErrorFormat("SMART card reader selected: {0}", crd);
smartCardReader = crd; /// NFC smart card reader detected smartCardReader = crd; /// NFC smart card reader detected
break; break;
} }
@ -241,14 +250,22 @@ namespace TBF.UI.Shared
void OnCardInserted(object sender, CardInsertedEventArgs args) void OnCardInserted(object sender, CardInsertedEventArgs args)
{ {
BackColor = Color.Green; string tag = string.Empty;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1); try
{
BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
/// Read the serial number of the card /// Read the serial number of the card
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7));
string tag = response.ToString(); tag = response.ToString();
card.Disconnect(DISCONNECT.Leave); card.Disconnect(DISCONNECT.Leave);
}
catch
{
tag = string.Empty;
}
if (testBenchComboBox.SelectedItem != null) if (testBenchComboBox.SelectedItem != null)
{ {
@ -281,7 +298,8 @@ namespace TBF.UI.Shared
{ {
if (!string.IsNullOrEmpty(smartCardReader)) if (!string.IsNullOrEmpty(smartCardReader))
{ {
card.StopCardEvents(); try { card.StopCardEvents(); }
catch { }
} }
} }
} }

View File

@ -307,14 +307,22 @@ namespace Users.Forms
void OnCardInserted(object sender, CardInsertedEventArgs args) void OnCardInserted(object sender, CardInsertedEventArgs args)
{ {
BackColor = Color.Green; string tag = string.Empty;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1); try
{
BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
/// Read the serial number of the card /// Read the serial number of the card
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7));
txtTag.Text = response.ToString(); txtTag.Text = response.ToString();
card.Disconnect(DISCONNECT.Leave); card.Disconnect(DISCONNECT.Leave);
}
catch
{
txtTag.Text = string.Empty;
}
} }
@ -327,7 +335,8 @@ namespace Users.Forms
{ {
if (!string.IsNullOrEmpty(smartCardReader)) if (!string.IsNullOrEmpty(smartCardReader))
{ {
card.StopCardEvents(); try { card.StopCardEvents(); }
catch { }
} }
} }
} }

View File

@ -278,14 +278,23 @@ namespace Users.Forms
void OnCardInserted(object sender, CardInsertedEventArgs args) void OnCardInserted(object sender, CardInsertedEventArgs args)
{ {
BackColor = Color.Green; string tag = string.Empty;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
/// Read the serial number of the card try
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7)); {
string tag = response.ToString(); BackColor = Color.Green;
card.Connect(smartCardReader, SHARE.Shared, PROTOCOL.T0orT1);
card.Disconnect(DISCONNECT.Leave); /// Read the serial number of the card
APDUResponse response = card.Transmit(new APDUCommand(0xFF, 0xCA, 0x00, 0x00, null, 7));
tag = response.ToString();
card.Disconnect(DISCONNECT.Leave);
}
catch
{
tag = string.Empty;
}
DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB }; DBSettings[] dbs = new DBSettings[] { GlobalData.RemoteUsersDB, GlobalData.LocalUsersDB };
bool authorized = false; bool authorized = false;
@ -335,7 +344,8 @@ namespace Users.Forms
{ {
if (!string.IsNullOrEmpty(smartCardReader)) if (!string.IsNullOrEmpty(smartCardReader))
{ {
card.StopCardEvents(); try { card.StopCardEvents(); }
catch { }
} }
} }
} }