https://github.com/puma/puma
I/O バウンドスレッドが上限を超えて終了した際に `@spawned` が減算されず `pool_capacity` がリークするバグを修正し、正確なスレッド数管理とプール容量回復を実現しました。
Puma の worker_check_interval が整数限定から Float 受容へ変更され、サブセカンド間隔でのワーカー監視が可能になり、ハング検知が高速化しました。
Puma が空チャンクサイズで例外を起こす問題を、正規表現バリデーションと具体的エラーメッセージで捕捉し、500 エラーを防ぎ 400 系に変換しました。
テスト `test_update_thread_pool_min_max` のフレークを、スリープを 0.001 s から 0.1 s に延長し解消。タイミング依存テストの安定化という設計判断が示された。
notify_safely が IO のロックと競合してワーカー停止がハングする問題を、IO#syswrite に置き換えることで解消し、シグナルハンドラから安全に呼び出せるようにした変更です。
Puma 7.2.1では、PROXYプロトコルv1のパーシングに存在する2つのセキュリティ上の問題が修正されました。細工された入力による悪用防止のための制限・アンカリングの追加と、keep-alive接続での複数回パーシングを防ぐ変更が含まれています。
Puma 7.2.1 のバックポートとして、PROXY Protocol v1 パーサーに存在した複数の問題が修正されました。CRLF なしに最大長(107バイト)に達した場合の接続エラー処理の追加、正規表現アンカーの `^` から `\A` への変更、そしてキープアライブ接続における2リクエスト目以降へのプロトコル再適用防止が含まれます。
Puma 8.0.2のリリースノートがmainブランチに追加されました。PROXYプロトコルv1の正規表現アンカー漏れによるインジェクション脆弱性と、keep-alive接続でのヘッダースプーフィング脆弱性の2件の修正が含まれる予定です。
Puma 8.0.2がリリースされ、PROXYプロトコルv1の処理に関する2つのセキュリティ上の問題が修正されました。正規表現へのアンカー追加と最大行長制限によるインジェクション防止と、keep-alive接続でのヘッダー解析を最初のリクエストのみに限定することによるスプーフィング防止が含まれています。
Puma 8.0.2 バックポートとして、PROXY Protocol v1 パーサーの3つのバグが修正されました。最大長に達しても CRLF のないヘッダーへの未定義動作、Keep-Alive 接続での2リクエスト目の誤パース、HTTP ボディ内の偽PROXYラインへの誤マッチという問題が、定数追加・正規表現アンカー修正・初期化ロジック変更によって解消されています。
Pumaのテスト実行時に余分な出力が混入していた問題を複数箇所で解消するPRです。makeのビルドログ抑制(MAKEFLAGSへの-sフラグ追加)、非推奨警告のcapture_ioによるキャプチャと内容検証、テストヘルパーのキーワード引数化、そしてclusterワーカーのIOError捕捉範囲のSystemCallErrorへの拡張が含まれます。
Puma v8で削除予定だった非推奨コールバック `on_booted`/`on_restart`/`on_stopped` の廃止をv9に延期しました。警告メッセージを「Puma v9」と明示するよう修正し、v9到達時にCIが自動的に失敗するバージョンガードテストを追加することで、削除漏れを防ぐ仕組みを導入しています。
Pumaに`allow_underscore_headers`設定が追加されました。`false`に設定するとアンダースコアを含むリクエストヘッダーを破棄し、Rackのenv正規化を悪用したヘッダーインジェクション攻撃を防ぎます。デフォルトは互換性のため`true`ですが、`puma.underscore_headers` envキーで監査しながら`false`への移行が推奨されています。
`Launcher` が `Configuration#clamp` を `initialize` と `run` の両方で呼び出し、`single {}` / `cluster {}` コールバックが二重実行されていたバグを修正。`run` 側の冗長な呼び出しを削除するとともに、`clamp` 自体に `@clamped` フラグによる冪等性ガードとdeprecation warningを追加し、Puma v9でのraiseへの段階的移行を準備しています。
Puma 8.0.1がリリースされました。主な修正は、`prune_bundler`のre-exec時に`BUNDLE_WITHOUT`などのユーザー設定の`BUNDLE_*`環境変数が消去されてワーカーがクラッシュするバグの解消です。あわせて、デバッグ無効時の不要な文字列生成を避けるためデバッグログをブロック渡しに変更するパフォーマンス改善も含まれています。
`prune_bundler` 使用時にPumaが `puma-wild` 経由で再実行される際、`Bundler.with_unbundled_env` が全 `BUNDLE_*` 変数を除去するにもかかわらず `BUNDLE_GEMFILE` と `BUNDLE_APP_CONFIG` の2変数しか復元されていませんでした。この修正により、`Bundler.original_env` から `BUNDLE_*` プレフィックスを持つ全変数を一括復元するようになり、`BUNDLE_WITHOUT` 等のユーザー設定変数が失われてワーカーがクラッシュする問題が解消されました。
デバッグが無効な場合でも文字列補間が評価される問題を解消するため、`Puma::LogWriter#debug` がブロック引数に対応しました。ブロックで渡された場合はデバッグ有効時のみ `yield` されるため、不要な文字列アロケーションを回避できます。引数形式の呼び出しとの後方互換性は維持されています。
Puma 8.0.0(コードネーム "Into the Arena")がリリースされました。IOバウンドリクエストが通常のスレッド上限を超えて処理できる `max_io_threads` と `env["puma.mark_as_io_bound"]` APIの追加、ランタイムでのスレッドプール変更API、シングル・クラスターモード別の設定DSLブロックが主な新機能です。破壊的変更としてデフォルトバインドアドレスが `0.0.0.0` から `::` (IPv6)に変更されており、IPv6が利用可能な環境での動作確認が必要です。
Pumaのデフォルトバインドアドレスが `::` に変更された副作用として、デュアルスタックソケット経由のIPv4接続で `REMOTE_ADDR` に `::ffff:127.0.0.1` 形式が表示される問題を修正。`Client#peerip` に `unmap_ipv6` メソッドを追加し、IPv4マップドIPv6アドレスを元のIPv4形式に変換して返すようにしました。
Pumaのプロダクション環境のデフォルトバインドアドレスが `0.0.0.0` から `::` に変更されました。単純な定数変更ではなく、`Socket.getifaddrs` によるランタイム検査でIPv6の可用性を確認し、非対応環境では `0.0.0.0` へ自動フォールバックする設計が採用されています。`::` は `0.0.0.0` のスーパーセットとして機能するため、既存のIPv4ワークフローへの影響はありません。