Watched word regular expression crash (2025)

Similar to this one

Repro

  • watched words regular expressions enabled
  • watched words tag action
  • regular expression *abc

Result

It is impossible to create topics or posts

RegexpError (target of repeat operator is not specified: /(*abc)/i)
app/services/word_watcher.rb:239:in `initialize'
app/services/word_watcher.rb:239:in `new'
app/services/word_watcher.rb:239:in `word_matches?'
lib/topic_creator.rb:214:in `block in setup_tags'
lib/topic_creator.rb:213:in `each'
lib/topic_creator.rb:213:in `setup_tags'
lib/topic_creator.rb:48:in `create'
lib/post_creator.rb:493:in `create_topic'

Cause

  • * means “repeat the previous token zero or more times”
  • there is no previous token
2개의 좋아요

So really the regex should be validated before allowing it to be added? And there should be a rescue so an invalid regex can’t crash the whole world?

1개의 좋아요

What obviously happened here is that the watched words were regular watched words and * was the wildcard, and then watched words regular expressions enabled was enabled.

So this

1개의 좋아요

Well, now it’s obvious when you say it like that. :rofl:

Valildating regex in on save seems like a very sane thing to do.

putting a pr-welcome on this, but team will triage and decide if it makes sense to do this in the upcoming weeks to save us future support.

1개의 좋아요

That won’t prevent people entering “normal” wildcard expressions, and then turning on watched words regular expressions enabled, which is what happened here.

I think it just needs an exception handler around the regexp call

  def word_matches?(word, case_sensitive: false)
    options = case_sensitive ? nil : Regexp::IGNORECASE
    Regexp.new(WordWatcher.word_to_regexp(word), options).match?(@raw)
  end
2개의 좋아요

Thanks for the report @RGJ, this will be fixed by

https://github.com/discourse/discourse/pull/35217

3개의 좋아요

This topic was automatically closed after 10 hours. New replies are no longer allowed.