Cloudflare 如何在 hyper HTTP 函式庫中找到一個悄悄截斷回應的 Bug
Cloudflare Blog · 2026-06-22
2025 年 12 月,Cloudflare 工程師在重構 Images binding 架構時,發現大型圖片轉換請求會間歇性地回傳 HTTP 200 但 body 被截斷。追查後確認根本原因藏在 Rust 非同步 HTTP 函式庫 hyper 的 HTTP/1 狀態機中,影響 0.14.x 至 1.8.x 的所有版本。修復已於 2026 年 6 月 11 日透過 PR #4018 合併主線。
原本的問題
Cloudflare 的重現腳本在 25 次請求中有 19 次失敗。一個 14.9 MB 的回應只傳出了 219 KB,其餘資料在連線關閉後就消失了。工程師使用 strace 追蹤系統呼叫,發現 socket 被呼叫 shutdown 的時間點距離最後一次 write 只有 138 微秒,遠不足以讓慢速客戶端讀完全部資料。
問題的觸發條件是:當回應 body 超過 socket 緩衝區大小,而客戶端讀取速度又比伺服器寫入速度慢時,socket 緩衝區會被填滿。此時 poll_flush() 回傳 Poll::Pending,代表資料尚未全部送出,但 hyper 的狀態機卻繼續推進。
漏洞機制
根本原因在 dispatch.rs 的 poll_shutdown() 實作中。原本的程式碼以 let _ = self.poll_flush(cx)?; 呼叫 flush,直接丟棄了回傳值,也就是說無論 flush 是否完成,結果都被忽略。
完整的失敗序列如下:
- 編碼完成,資料寫入內部緩衝區
- 嘗試 flush,socket 緩衝區已滿,
poll_flush回傳Pending let _忽略Pending信號,狀態機繼續執行wants_read_again()回傳false,狀態機進入shutdown- 連線關閉,緩衝區剩餘資料全部遺失
這個模式在 Rust 非同步程式設計中屬於典型的 Pending 信號被吞噬問題:非同步執行器期待 Pending 能正確傳回上層讓出控制權,一旦中途被丟棄,整個 future 的 wakeup 鏈就斷裂了。
採用的方法
修復方式十分直接:在 poll_shutdown() 中先以 ready! macro 等待 flush 真正完成,才呼叫底層的 poll_shutdown。
// 修復後的 poll_shutdown(PR #4018)
ready!(self.poll_flush(cx)?);
Pin::new(&mut self.io).poll_shutdown(cx)ready! macro 的作用是:若 future 仍回傳 Pending,立即從當前 poll 返回,讓執行器在下次 socket 可寫時重新喚醒,確保所有緩衝資料都已送出後才執行真正的連線關閉。Cloudflare 在主線合併前已先部署內部 fork 版本應急。
影響範圍
此 bug 以 issue #4022 追蹤,確認影響 hyper 0.14.x 到 1.8.x 的 HTTP/1 伺服器端。HTTP/2 因採用不同的流量控制機制不受影響。任何以 hyper 作為 HTTP/1 後端並回傳大型 body 的服務(包括 Rust 生態中常見的 axum、warp、actix-web 底層),都應關注下一個包含此修復的 hyper 發行版本。
原始來源:Cloudflare Blog — How we found a bug in the hyper HTTP library、hyper PR #4018
Xfce Wayland 合成器 xfwl4 釋出首個預覽版本
spurint.org · 2026-06-22
2026 年 6 月,Xfce 核心團隊贊助開發、由 Brian Tarricone 主導的 Wayland 合成器 xfwl4 釋出了第一個預覽(Alpha)版本 4.21。這個專案自 2026 年 1 月 19 日建立,歷經近六個月開發,目標是讓使用者在 Wayland 環境下獲得與 Xfce on X11 盡可能一致的桌面體驗。
背景
Xfce 一直是以 X11 為核心設計的桌面環境,其視窗管理員 xfwm4 不支援 Wayland 協定。隨著主流 Linux 發行版逐步將預設會話切換至 Wayland,Xfce 用戶面臨無法原生使用 Wayland 的困境,只能退回 XWayland 相容層或改用其他桌面。xfwl4 的出現正是為了填補這個空缺。
核心改動
xfwl4 以獨立的 Wayland compositor 形式存在,而非對 xfwm4 進行修改。4.21 預覽版提供以下核心功能:
- 標準視窗操作:最大化、最小化、全螢幕
- 基本視窗切換(Alt+Tab 循環)
- 支援套用 X11 系統設定至 Wayland 環境
- Wayland 協定基礎支援
當前版本明確列出尚未完成的項目,包括:滑鼠與觸控板設定對話框、工作區設定、螢幕邊距、桌面圖示視圖、分頁縮圖,以及應用程式視窗切換快捷鍵。這是一個供早期測試者試用的 Alpha 品質版本,不建議用於正式生產環境。
影響範圍
xfwl4 的原始碼託管於 gitlab.xfce.org/xfce/xfwl4,以 GNU GPLv3 授權發佈。對於長期依賴 Xfce 輕量級特性的嵌入式系統開發者或低規格硬體用戶,這個專案的進展值得持續追蹤;xfwl4 成熟後將是 Xfce 生態系從 X11 遷移至 Wayland 的關鍵路徑。
原始來源:spurint.org — xfwl4's first preview release、GitLab — xfce/xfwl4