이미지 대체 텍스트에서 밑줄을 이중 이스케이프하면 게시글 원본이 편집될 때마다 손상됩니다

게시물에 파일명에 밑줄이 포함된 이미지가 있는 경우(예: ), 게시물을 저장할 때마다 원본 콘텐츠에서 밑줄 앞의 역슬래시가 두 배로 증가합니다:

  • 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 콘솔에서 실행하여 불필요한 역슬래시를 제거하고 다시 베이킹(rebake)합니다:

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

환경:

  • Discourse 버전: 2026.4.0-latest
  • 공식 ./launcher Docker 설치를 통해 설치됨

@Елиан_Гешев, 보고해 주셔서 감사합니다. 이는 최근 커밋(recent commit)에서 발생한 회귀(regression)일 가능성이 높습니다.

확인해 보겠습니다 :eyes:

이건 좀 까다로운 문제네요 :thinking: