画像のaltテキストにおけるアンダースコアの二重エスケープが、編集のたびに投稿の生データを破損させる

投稿にファイル名にアンダースコアが含まれる画像が含まれている場合(例:)、投稿を保存するたびに、生コンテンツ内のアンダースコア前のバックスラッシュが倍増します。

  • 1 回目の編集後:![20260421_140231|…]
  • 2 回目の編集後:![20260421\_140231|…]
  • N 回目の編集後:![20260421{2^N}_140231|…]

17 回の編集後、生フィールドには 131,072 個のバックスラッシュ文字(2^17)が蓄積され、約 8KB から約 136KB に膨れ上がります。これにより、最終的に投稿が編集不可能になります。表示されているコンテンツは小さいにもかかわらず、コンポーザーは max_post_length を大幅に超える文字数を報告します。

再現手順:

  1. ファイル名にアンダースコアが含まれる画像をアップロードします。
  2. 投稿に挿入します。Discourse は 20260421_140231 のような代替テキストを生成します。
  3. 投稿を繰り返し編集して保存します(5〜10 回で増加に気づくことができます)。
  4. /posts/{id}.json を介して生コンテンツを確認します。保存するたびにバックスラッシュの数が倍になります。

期待される動作:生コンテンツは編集を通じて安定しているはずです。画像の代替テキスト内のアンダースコアは、保存のたびに再エスケープされてはいけません。

実際の動作:保存のたびに、画像の代替テキスト内の _ 前のバックスラッシュが 2 倍になります。

回避策:以下のコマンドを Rails コンソールで実行して、余分なバックスラッシュを削除し、再構築してください。

p = Post.find(POST_ID)
p.update_column(:raw, p.raw.gsub(/\+(?=_)/, “”))
p.rebake!

環境情報:

  • Discourse バージョン:2026.4.0-latest
  • 公式の ./launcher Docker 環境経由でインストール済み

ご報告ありがとうございます、@Елиан_Гешev さん。これはおそらく 最近のコミット による回帰現象です。

確認します :eyes: