aboutsummaryrefslogtreecommitdiff
path: root/setup
diff options
context:
space:
mode:
authorbodqhrohro <bodqhrohro@gmail.com>2021-06-07 11:13:40 +0300
committerGitHub <noreply@github.com>2021-06-07 09:13:40 +0100
commitc488d3db752e68c222c2e35a5d5688c399f09268 (patch)
treecc96d66c584932b1f34aa295d13e0fa1194f3190 /setup
parentf18001ecbbfe2c70c5bce41e0f8373750f528ace (diff)
Fix SIGSEGV in IsInterestedInRoomID (#1846)
* Avoid crash on non-compiled room regex Roughly fixes #1845 (actual compiling still needed) Signed-off-by: Bohdan Horbeshko <bodqhrohro@gmail.com> * Compile regexes for all namespaces Deadheres the regex compiling from building larger regexes for possibly exclusive namespaces only. A complete fix for #1845, so regexes for rooms namespaces and other non-whitelisted namespaces can be used more safely. Signed-off-by: Bohdan Horbeshko <bodqhrohro@gmail.com> * Appservice config: handle regexp parsing errors Signed-off-by: diamondburned <datutbrus@gmail.com> Signed-off-by: Bohdan Horbeshko <bodqhrohro@gmail.com> Co-authored-by: Kegsay <kegan@matrix.org>
Diffstat (limited to 'setup')
-rw-r--r--setup/config/config_appservice.go23
1 files changed, 20 insertions, 3 deletions
diff --git a/setup/config/config_appservice.go b/setup/config/config_appservice.go
index 4a14672e..9bd8a1b5 100644
--- a/setup/config/config_appservice.go
+++ b/setup/config/config_appservice.go
@@ -101,7 +101,7 @@ func (a *ApplicationService) IsInterestedInRoomID(
) bool {
if namespaceSlice, ok := a.NamespaceMap["rooms"]; ok {
for _, namespace := range namespaceSlice {
- if namespace.RegexpObject.MatchString(roomID) {
+ if namespace.RegexpObject != nil && namespace.RegexpObject.MatchString(roomID) {
return true
}
}
@@ -222,6 +222,10 @@ func setupRegexps(asAPI *AppServiceAPI, derived *Derived) (err error) {
case "aliases":
appendExclusiveNamespaceRegexs(&exclusiveAliasStrings, namespaceSlice)
}
+
+ if err = compileNamespaceRegexes(namespaceSlice); err != nil {
+ return fmt.Errorf("invalid regex in appservice %q, namespace %q: %w", appservice.ID, key, err)
+ }
}
}
@@ -258,16 +262,29 @@ func setupRegexps(asAPI *AppServiceAPI, derived *Derived) (err error) {
func appendExclusiveNamespaceRegexs(
exclusiveStrings *[]string, namespaces []ApplicationServiceNamespace,
) {
- for index, namespace := range namespaces {
+ for _, namespace := range namespaces {
if namespace.Exclusive {
// We append parenthesis to later separate each regex when we compile
// i.e. "app1.*", "app2.*" -> "(app1.*)|(app2.*)"
*exclusiveStrings = append(*exclusiveStrings, "("+namespace.Regex+")")
}
+ }
+}
+// compileNamespaceRegexes turns strings into regex objects and complains
+// if some of there are bad
+func compileNamespaceRegexes(namespaces []ApplicationServiceNamespace) (err error) {
+ for index, namespace := range namespaces {
// Compile this regex into a Regexp object for later use
- namespaces[index].RegexpObject, _ = regexp.Compile(namespace.Regex)
+ r, err := regexp.Compile(namespace.Regex)
+ if err != nil {
+ return fmt.Errorf("regex at namespace %d: %w", index, err)
+ }
+
+ namespaces[index].RegexpObject = r
}
+
+ return nil
}
// checkErrors checks for any configuration errors amongst the loaded