Skip to content

Commit 243fafe

Browse files
committed
fix(Core): prevent NullReferenceExceptions in LinuxCapture CaptureScreen
- Added explicit null validation for `CaptureFullscreen` results to prevent downstream cropping crashes. - Implemented `Rectangle.Empty` validation for screen detection to handle invalid coordinates gracefully. - Used `ConfigureAwait(false)` to prevent potential deadlocks during async capture transitions.
1 parent 72d6f45 commit 243fafe

1 file changed

Lines changed: 25 additions & 5 deletions

File tree

SnapX.Core/SharpCapture/Linux/LinuxCapture.cs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,34 @@ private static Image CropFullscreenScreenshotToBounds(Rectangle bounds, Image im
142142
}
143143
public override async Task<Image?> CaptureScreen(Rectangle bounds)
144144
{
145-
var fullscreenImage = await CaptureFullscreen().ConfigureAwait(false);
146-
var croppedImage = CropFullscreenScreenshotToBounds(bounds, fullscreenImage);
147-
return croppedImage;
145+
using var fullscreenImage = await CaptureFullscreen().ConfigureAwait(false);
146+
147+
if (fullscreenImage == null)
148+
{
149+
DebugHelper.Logger?.Error("[LinuxCapture] Fullscreen capture returned null.");
150+
return null;
151+
}
152+
153+
return CropFullscreenScreenshotToBounds(bounds, fullscreenImage);
148154
}
155+
149156
public override async Task<Image?> CaptureScreen(Point? pos)
150157
{
151-
if (pos == null || !pos.HasValue) throw new ArgumentNullException(nameof(pos));
152-
return await CaptureScreen(await GetScreen(pos.Value));
158+
if (pos == null)
159+
{
160+
DebugHelper.Logger?.Error("[LinuxCapture] Position point was null.");
161+
throw new ArgumentNullException(nameof(pos));
162+
}
163+
164+
var screen = await GetScreen(pos.Value).ConfigureAwait(false);
165+
166+
if (screen == Rectangle.Empty)
167+
{
168+
DebugHelper.Logger?.Error($"[LinuxCapture] Could not find screen at coordinates: {pos.Value}");
169+
return null;
170+
}
171+
172+
return await CaptureScreen(screen).ConfigureAwait(false);
153173
}
154174

155175
public override async Task<Rectangle> GetScreen(Point pos) => Methods.NativeAPI.GetScreen(pos)?.Bounds ?? Rectangle.Empty;

0 commit comments

Comments
 (0)