nginx-util: fix SEGFAULT from regex_search
authorChristian Marangi <ansuelsmth@gmail.com>
Thu, 9 May 2024 17:17:38 +0000 (19:17 +0200)
committerChristian Marangi <ansuelsmth@gmail.com>
Thu, 9 May 2024 17:20:22 +0000 (19:20 +0200)
In converting nginx-util to PCRE2, it was wrongly dropped saving the
results of the regex match causing segmentation fault when used.

Add the missing code to correctly store the vector of the results from
the regex.

Fixes: b738e42c4de8 ("nginx-util: move to pcre2")
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
net/nginx-util/Makefile
net/nginx-util/src/regex-pcre.hpp

index b4f06aaae0af47ae8d37ab1828d902b895fc4a29..8b189aeda0b5bfc804aa53e4c3f2056927787221 100644 (file)
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nginx-util
 PKG_VERSION:=1.6
-PKG_RELEASE:=20
+PKG_RELEASE:=21
 PKG_MAINTAINER:=Peter Stadler <peter.stadler@student.uibk.ac.at>
 
 include $(INCLUDE_DIR)/package.mk
index ab255542b3d58380ea70885f744459861d0c5023..f8713e82a4347587b965f1e85cba4bdd09f293c4 100644 (file)
@@ -132,7 +132,7 @@ class smatch {
 
     std::string::const_iterator end;
 
-    std::vector<int> vec{};
+    std::vector<PCRE2_SIZE> vec{};
 
     int n = 0;
 
@@ -227,13 +227,21 @@ auto regex_search(const std::string::const_iterator begin,
     match.vec.reserve(sz);
 
     const char* subj = &*begin;
-    int len = static_cast<int>(&*end - subj);
+    int n, len = static_cast<int>(&*end - subj);
+    unsigned int ov_count;
+    PCRE2_SIZE *ov;
 
     match.begin = begin;
     match.end = end;
 
     pcre2_match_data *match_data = pcre2_match_data_create(sz, NULL);
-    match.n = pcre2_match(rgx(), (PCRE2_SPTR)subj, len, 0, 0, match_data, NULL);
+    n = pcre2_match(rgx(), (PCRE2_SPTR)subj, len, 0, 0, match_data, NULL);
+    ov = pcre2_get_ovector_pointer(match_data);
+    ov_count = pcre2_get_ovector_count(match_data);
+
+    match.vec.assign(ov, ov + ov_count);
+    match.n = n;
+
     pcre2_match_data_free(match_data);
 
     if (match.n < 0) {