diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 14:40:01 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-20 14:40:01 +0300 |
| commit | 5be7d07018c4e039468a0c48e7103e7508ef55cd (patch) | |
| tree | 3c6d12f5a09f207903130d6537854521435b9999 /src/platform/macos.rs | |
| parent | 00819ac000bf89dc822da67bca6cd238796c23e6 (diff) | |
fix: cap clipboard image reads
Diffstat (limited to 'src/platform/macos.rs')
| -rw-r--r-- | src/platform/macos.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/platform/macos.rs b/src/platform/macos.rs index d0cf43c8..7bec8e26 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -5,7 +5,10 @@ use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::sync::OnceLock; -use super::{ClipboardCommand, ClipboardImage, ForegroundJob, ForegroundProcess, Signal}; +use super::{ + read_limited_reader, ClipboardCommand, ClipboardImage, ForegroundJob, ForegroundProcess, + LimitedRead, Signal, +}; const PROC_PGRP_ONLY: u32 = 2; @@ -227,10 +230,17 @@ pub fn read_clipboard_image() -> Option<ClipboardImage> { return None; } - let bytes = std::fs::read(&path).ok(); + let bytes = match std::fs::File::open(&path).ok().and_then(|file| { + read_limited_reader(file, crate::server::protocol::MAX_CLIPBOARD_IMAGE_PAYLOAD).ok() + }) { + Some(LimitedRead::Complete(bytes)) => bytes, + Some(LimitedRead::Empty | LimitedRead::Oversized) | None => { + let _ = std::fs::remove_file(&path); + return None; + } + }; let _ = std::fs::remove_file(&path); - let bytes = bytes?; - (!bytes.is_empty()).then_some(ClipboardImage { + Some(ClipboardImage { bytes, extension: "png", }) |
