Skip to content

Commit 91ff724

Browse files
committed
SEBWIN-1146: Fixed deadlock introduced with runtime integrity monitoring.
1 parent 5b9d6c2 commit 91ff724

2 files changed

Lines changed: 34 additions & 16 deletions

File tree

SafeExamBrowser.Client/Responsibilities/IntegrityResponsibility.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
using System;
1010
using System.Linq;
1111
using System.Threading.Tasks;
12-
using System.Windows;
13-
using System.Windows.Threading;
12+
using System.Timers;
1413
using SafeExamBrowser.Client.Contracts;
1514
using SafeExamBrowser.Configuration.Contracts.Integrity;
1615
using SafeExamBrowser.I18n.Contracts;
@@ -23,15 +22,15 @@ internal class IntegrityResponsibility : ClientResponsibility
2322
{
2423
private readonly ICoordinator coordinator;
2524
private readonly IText text;
26-
private readonly DispatcherTimer timer;
25+
private readonly Timer timer;
2726

2827
private IIntegrityModule IntegrityModule => Context.IntegrityModule;
2928

3029
public IntegrityResponsibility(ClientContext context, ICoordinator coordinator, ILogger logger, IText text) : base(context, logger)
3130
{
3231
this.coordinator = coordinator;
3332
this.text = text;
34-
this.timer = new DispatcherTimer(DispatcherPriority.Normal, Application.Current.Dispatcher);
33+
this.timer = new Timer();
3534
}
3635

3736
public override void Assume(ClientTask task)
@@ -65,18 +64,25 @@ private void ScheduleIntegrityVerification()
6564

6665
private void StartIntegrityMonitoring()
6766
{
68-
timer.Interval = TimeSpan.FromSeconds(5);
69-
timer.Tick += Timer_Tick;
67+
const int FIVE_SECONDS = 5000;
68+
69+
timer.AutoReset = false;
70+
timer.Interval = FIVE_SECONDS;
71+
timer.Elapsed += Timer_Elapsed;
7072
timer.Start();
73+
74+
Logger.Info("Started monitoring runtime integrity.");
7175
}
7276

7377
private void StopIntegrityMonitoring()
7478
{
7579
timer.Stop();
76-
timer.Tick -= Timer_Tick;
80+
timer.Elapsed -= Timer_Elapsed;
81+
82+
Logger.Info("Stopped monitoring runtime integrity.");
7783
}
7884

79-
private void Timer_Tick(object sender, EventArgs e)
85+
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
8086
{
8187
Logger.Info("Attempting to verify runtime integrity...");
8288

@@ -88,6 +94,8 @@ private void Timer_Tick(object sender, EventArgs e)
8894
{
8995
Logger.Warn("Failed to verify runtime integrity!");
9096
}
97+
98+
timer.Start();
9199
}
92100

93101
private void UpdateSessionIntegrity()

SafeExamBrowser.Runtime/Responsibilities/IntegrityResponsibility.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88

99
using System;
1010
using System.Threading.Tasks;
11-
using System.Windows;
12-
using System.Windows.Threading;
11+
using System.Timers;
1312
using SafeExamBrowser.Configuration.Contracts.Integrity;
1413
using SafeExamBrowser.Logging.Contracts;
1514

@@ -19,7 +18,7 @@ internal class IntegrityResponsibility : RuntimeResponsibility
1918
{
2019
private readonly IIntegrityModule integrityModule;
2120
private readonly Action shutdown;
22-
private readonly DispatcherTimer timer;
21+
private readonly Timer timer;
2322

2423
public IntegrityResponsibility(
2524
IIntegrityModule integrityModule,
@@ -29,7 +28,7 @@ public IntegrityResponsibility(
2928
{
3029
this.integrityModule = integrityModule;
3130
this.shutdown = shutdown;
32-
this.timer = new DispatcherTimer(DispatcherPriority.Normal, Application.Current.Dispatcher);
31+
this.timer = new Timer();
3332
}
3433

3534
public override void Assume(RuntimeTask task)
@@ -47,18 +46,25 @@ public override void Assume(RuntimeTask task)
4746

4847
private void StartIntegrityMonitoring()
4948
{
50-
timer.Interval = TimeSpan.FromSeconds(5);
51-
timer.Tick += Timer_Tick;
49+
const int FIVE_SECONDS = 5000;
50+
51+
timer.AutoReset = false;
52+
timer.Interval = FIVE_SECONDS;
53+
timer.Elapsed += Timer_Elapsed;
5254
timer.Start();
55+
56+
Logger.Info("Started monitoring runtime integrity.");
5357
}
5458

5559
private void StopIntegrityMonitoring()
5660
{
5761
timer.Stop();
58-
timer.Tick -= Timer_Tick;
62+
timer.Elapsed -= Timer_Elapsed;
63+
64+
Logger.Info("Stopped monitoring runtime integrity.");
5965
}
6066

61-
private void Timer_Tick(object sender, EventArgs e)
67+
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
6268
{
6369
Logger.Info("Attempting to verify runtime integrity...");
6470

@@ -70,6 +76,8 @@ private void Timer_Tick(object sender, EventArgs e)
7076
{
7177
Logger.Warn("Failed to verify runtime integrity!");
7278
}
79+
80+
timer.Start();
7381
}
7482

7583
private void HandleRuntimeIntegrityStatus(bool isValid)
@@ -82,6 +90,8 @@ private void HandleRuntimeIntegrityStatus(bool isValid)
8290
{
8391
Logger.Error("Runtime integrity is compromised!");
8492

93+
StopIntegrityMonitoring();
94+
8595
Task.Run(() =>
8696
{
8797
if (SessionIsRunning)

0 commit comments

Comments
 (0)