Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ugrep for openSUSE:Factory checked 
in at 2026-09-16 17:44:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ugrep (Old)
 and      /work/SRC/openSUSE:Factory/.ugrep.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ugrep"

Wed Sep 16 17:44:17 2026 rev:95 rq:1378211 version:7.8.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/ugrep/ugrep.changes      2026-08-06 
16:28:27.357515759 +0200
+++ /work/SRC/openSUSE:Factory/.ugrep.new.383539/ugrep.changes  2026-09-16 
17:48:24.876233129 +0200
@@ -1,0 +2,15 @@
+Tue Sep 15 18:09:07 UTC 2026 - Andreas Stieger <[email protected]>
+
+- Update to version 7.8.5:
+  * update option --encoding=CP437 to retain LF (10) and CR (13)
+    codes in the output
+  * fix a rare edge case for the --encoding option when internally
+    converting a specified code page or a utf-encoding to UTF-8
+  * update option -z (--decompress) for reasonable xz/lzma decoding
+    limits
+  * update matching mode flags -E, -F, -G, and -P to respect order
+    on the command line to permit overriding (like BSD grep)
+  * output an error message when regex matching mode flags are used
+    in a config file, instead of silently ignoring them
+
+-------------------------------------------------------------------

Old:
----
  ugrep-7.8.4.obscpio

New:
----
  ugrep-7.8.5.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ugrep.spec ++++++
--- /var/tmp/diff_new_pack.nT0a5X/_old  2026-09-16 17:48:26.068282916 +0200
+++ /var/tmp/diff_new_pack.nT0a5X/_new  2026-09-16 17:48:26.071283041 +0200
@@ -23,7 +23,7 @@
 %bcond_without fish
 %endif
 Name:           ugrep
-Version:        7.8.4
+Version:        7.8.5
 Release:        0
 Summary:        Universal grep: a feature-rich grep implementation with focus 
on speed
 License:        BSD-3-Clause

++++++ _service ++++++
--- /var/tmp/diff_new_pack.nT0a5X/_old  2026-09-16 17:48:26.107284545 +0200
+++ /var/tmp/diff_new_pack.nT0a5X/_new  2026-09-16 17:48:26.112284754 +0200
@@ -5,7 +5,7 @@
     <param name="changesgenerate">enable</param>
     <param name="filename">ugrep</param>
     <param name="versionformat">@PARENT_TAG@</param>
-    <param name="revision">v7.8.4</param>
+    <param name="revision">v7.8.5</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="versionrewrite-replacement">\1</param>
   </service>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.nT0a5X/_old  2026-09-16 17:48:26.141285965 +0200
+++ /var/tmp/diff_new_pack.nT0a5X/_new  2026-09-16 17:48:26.146286174 +0200
@@ -1,7 +1,7 @@
 <servicedata>
   <service name="tar_scm">
       <param name="url">https://github.com/Genivia/ugrep.git</param>
-      <param 
name="changesrevision">550599a6434fc5315fb6ecd415a5d859e6d846a8</param>
+      <param 
name="changesrevision">f2cc252c011460f6c75b1fb591813b4b6b59c225</param>
   </service>
 </servicedata>
 (No newline at EOF)

++++++ ugrep-7.8.4.obscpio -> ugrep-7.8.5.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/.github/workflows/codeql.yml 
new/ugrep-7.8.5/.github/workflows/codeql.yml
--- old/ugrep-7.8.4/.github/workflows/codeql.yml        2026-08-05 
16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/.github/workflows/codeql.yml        2026-09-15 
13:41:49.000000000 +0200
@@ -27,16 +27,16 @@
         uses: actions/checkout@v7
 
       - name: Initialize CodeQL
-        uses: github/codeql-action/[email protected]
+        uses: github/codeql-action/[email protected]
         with:
           languages: ${{ matrix.language }}
           config-file: .github/config.yml
 
       - name: Autobuild
-        uses: github/codeql-action/[email protected]
+        uses: github/codeql-action/[email protected]
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/[email protected]
+        uses: github/codeql-action/[email protected]
         with:
           upload: false # disable the upload here - we will upload in a 
different action
           output: sarif-results
@@ -55,6 +55,6 @@
           output: sarif-results/${{ matrix.language }}.sarif
 
       - name: Upload SARIF
-        uses: github/codeql-action/[email protected]
+        uses: github/codeql-action/[email protected]
         with:
           sarif_file: sarif-results/${{ matrix.language }}.sarif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/CONTRIBUTING.md 
new/ugrep-7.8.5/CONTRIBUTING.md
--- old/ugrep-7.8.4/CONTRIBUTING.md     2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/CONTRIBUTING.md     2026-09-15 13:41:49.000000000 +0200
@@ -39,6 +39,12 @@
 
 Contributions are covered under the [BSD-3 license](LICENSE.txt).
 
-Thanks!
+Authenticity: no AI was used in the creation of the ugrep source code and
+documentation.  Contributions must be authored by the submitter, with a few
+exceptions such as porting changes from another fork while maintaining
+attributions.  Contents sourced from AI tools such as LLMs, including but not
+limited to documentation files, source code, and configuration scrips, are not
+permitted as they are unauthored and based on (trained on) copyright-protected
+sources.
 
-Robert van Engelen, Genivia Inc.
+Thanks!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/README.md new/ugrep-7.8.5/README.md
--- old/ugrep-7.8.4/README.md   2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/README.md   2026-09-15 13:41:49.000000000 +0200
@@ -5541,7 +5541,7 @@
     BUGS
            Report bugs at: <https://github.com/Genivia/ugrep/issues>
 
-    ugrep 7.8.4                      August 5, 2026                         
UGREP(1)
+    ugrep 7.8.5                    September 15, 2026                       
UGREP(1)
 
 🔝 [Back to table of contents](#toc)
 
Binary files old/ugrep-7.8.4/bin/win32/ug.exe and 
new/ugrep-7.8.5/bin/win32/ug.exe differ
Binary files old/ugrep-7.8.4/bin/win32/ugrep-indexer.exe and 
new/ugrep-7.8.5/bin/win32/ugrep-indexer.exe differ
Binary files old/ugrep-7.8.4/bin/win32/ugrep.exe and 
new/ugrep-7.8.5/bin/win32/ugrep.exe differ
Binary files old/ugrep-7.8.4/bin/win64/ug.exe and 
new/ugrep-7.8.5/bin/win64/ug.exe differ
Binary files old/ugrep-7.8.4/bin/win64/ugrep-indexer.exe and 
new/ugrep-7.8.5/bin/win64/ugrep-indexer.exe differ
Binary files old/ugrep-7.8.4/bin/win64/ugrep.exe and 
new/ugrep-7.8.5/bin/win64/ugrep.exe differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/configure new/ugrep-7.8.5/configure
--- old/ugrep-7.8.4/configure   2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/configure   2026-09-15 13:41:49.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.73 for ugrep 7.8.4.
+# Generated by GNU Autoconf 2.73 for ugrep 7.8.5.
 #
 # Report bugs to <https://github.com/Genivia/ugrep/issues>.
 #
@@ -590,8 +590,8 @@
 # Identity of this package.
 PACKAGE_NAME='ugrep'
 PACKAGE_TARNAME='ugrep'
-PACKAGE_VERSION='7.8.4'
-PACKAGE_STRING='ugrep 7.8.4'
+PACKAGE_VERSION='7.8.5'
+PACKAGE_STRING='ugrep 7.8.5'
 PACKAGE_BUGREPORT='https://github.com/Genivia/ugrep/issues'
 PACKAGE_URL='https://ugrep.com'
 
@@ -1369,7 +1369,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures ugrep 7.8.4 to adapt to many kinds of systems.
+'configure' configures ugrep 7.8.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1440,7 +1440,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ugrep 7.8.4:";;
+     short | recursive ) echo "Configuration of ugrep 7.8.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1618,7 +1618,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ugrep configure 7.8.4
+ugrep configure 7.8.5
 generated by GNU Autoconf 2.73
 
 Copyright (C) 2026 Free Software Foundation, Inc.
@@ -2172,7 +2172,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ugrep $as_me 7.8.4, which was
+It was created by ugrep $as_me 7.8.5, which was
 generated by GNU Autoconf 2.73.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -3786,7 +3786,7 @@
 
 # Define the identity of the package.
  PACKAGE='ugrep'
- VERSION='7.8.4'
+ VERSION='7.8.5'
 
 
 printf '%s\n' "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -11945,7 +11945,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ugrep $as_me 7.8.4, which was
+This file was extended by ugrep $as_me 7.8.5, which was
 generated by GNU Autoconf 2.73.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -12018,7 +12018,7 @@
 cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-ugrep config.status 7.8.4
+ugrep config.status 7.8.5
 configured by $0, generated by GNU Autoconf 2.73,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/configure.ac new/ugrep-7.8.5/configure.ac
--- old/ugrep-7.8.4/configure.ac        2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/configure.ac        2026-09-15 13:41:49.000000000 +0200
@@ -1,4 +1,4 @@
-AC_INIT([ugrep],[7.8.4],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com])
+AC_INIT([ugrep],[7.8.5],[https://github.com/Genivia/ugrep/issues],[ugrep],[https://ugrep.com])
 AM_INIT_AUTOMAKE([foreign subdir-objects dist-xz no-dist-gzip])
 AC_CONFIG_HEADERS([config.h])
 AC_COPYRIGHT([Copyright (C) 2019-2026 Robert van Engelen, Genivia Inc.])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/lib/convert.cpp 
new/ugrep-7.8.5/lib/convert.cpp
--- old/ugrep-7.8.4/lib/convert.cpp     2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/lib/convert.cpp     2026-09-15 13:41:49.000000000 +0200
@@ -401,7 +401,7 @@
 {
   if (ranges.find('\n') != ranges.end())
     nl = true;
-  if (is_modified(mod, 'i') || (is_modified(mod, 'a') && is_modified(mod, 'u') 
&& ranges.hi() > 0x7F))
+  if (is_modified(mod, 'a') && is_modified(mod, 'u') && ranges.hi() > 0x7F)
     convert_anycase_ranges(ranges);
   if (is_modified(mod, 'u') && ranges.hi() > 0x7F)
     return convert_unicode_ranges(ranges, flags, signature, par);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/lib/input.cpp 
new/ugrep-7.8.5/lib/input.cpp
--- old/ugrep-7.8.4/lib/input.cpp       2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/lib/input.cpp       2026-09-15 13:41:49.000000000 +0200
@@ -54,9 +54,9 @@
 
 const unsigned short codepages[38][256] =
 {
-  // DOS CP 437 to Unicode
+  // DOS CP 437 to Unicode, but preserve 0 (NUL), 10 (LF), 13 (CR)
   {
-       
0,0x263A,0x263B,0x2665,0x2666,0x2663,0x2660,0x2022,0x25D8,0x25CB,0x25D9,0x2642,0x2640,0x266A,0x266B,0x263C,
+       0,0x263A,0x263B,0x2665,0x2666,0x2663,0x2660,0x2022,0x25D8,0x25CB,    
10,0x2642,0x2640,    13,0x266B,0x263C,
   
0x25BA,0x25C4,0x2195,0x203C,0x00B6,0x00A7,0x25AC,0x21A8,0x2191,0x2193,0x2192,0x2190,0x221F,0x2194,0x25B2,0x25BC,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,    
42,    43,    44,    45,    46,    47,
       48,    49,    50,    51,    52,    53,    54,    55,    56,    57,    
58,    59,    60,    61,    62,    63,
@@ -791,7 +791,7 @@
           {
             std::memcpy(t, utf8_, n);
             uidx_ = static_cast<unsigned short>(n);
-            ulen_ = static_cast<unsigned short>(l);
+            ulen_ = static_cast<unsigned short>(l - n);
             t += n;
             n = 0;
           }
@@ -830,7 +830,7 @@
           {
             std::memcpy(t, utf8_, n);
             uidx_ = static_cast<unsigned short>(n);
-            ulen_ = static_cast<unsigned short>(l);
+            ulen_ = static_cast<unsigned short>(l - n);
             t += n;
             n = 0;
           }
@@ -861,7 +861,7 @@
           {
             std::memcpy(t, utf8_, n);
             uidx_ = static_cast<unsigned short>(n);
-            ulen_ = static_cast<unsigned short>(l);
+            ulen_ = static_cast<unsigned short>(l - n);
             t += n;
             n = 0;
           }
@@ -892,7 +892,7 @@
           {
             std::memcpy(t, utf8_, n);
             uidx_ = static_cast<unsigned short>(n);
-            ulen_ = static_cast<unsigned short>(l);
+            ulen_ = static_cast<unsigned short>(l - n);
             t += n;
             n = 0;
           }
@@ -929,7 +929,7 @@
           else
           {
             uidx_ = 1;
-            ulen_ = 2;
+            ulen_ = 1;
           }
         }
       }
@@ -983,7 +983,7 @@
           {
             std::memcpy(t, utf8_, n);
             uidx_ = static_cast<unsigned short>(n);
-            ulen_ = static_cast<unsigned short>(l);
+            ulen_ = static_cast<unsigned short>(l - n);
             t += n;
             n = 0;
           }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/man/ug.1 new/ugrep-7.8.5/man/ug.1
--- old/ugrep-7.8.4/man/ug.1    2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/man/ug.1    2026-09-15 13:41:49.000000000 +0200
@@ -1,4 +1,4 @@
-.TH UGREP "1" "August 05, 2026" "ugrep 7.8.4" "User Commands"
+.TH UGREP "1" "September 15, 2026" "ugrep 7.8.5" "User Commands"
 .SH NAME
 \fBugrep\fR, \fBug\fR -- file pattern searcher
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/man/ugrep-indexer.1 
new/ugrep-7.8.5/man/ugrep-indexer.1
--- old/ugrep-7.8.4/man/ugrep-indexer.1 2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/man/ugrep-indexer.1 2026-09-15 13:41:49.000000000 +0200
@@ -1,4 +1,4 @@
-.TH UGREP-INDEXER "1" "August 05, 2026" "ugrep-indexer 7.8.4" "User Commands"
+.TH UGREP-INDEXER "1" "September 15, 2026" "ugrep-indexer 7.8.5" "User 
Commands"
 .SH NAME
 \fBugrep-indexer\fR -- file indexer to accelerate recursive searching
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/man/ugrep.1 new/ugrep-7.8.5/man/ugrep.1
--- old/ugrep-7.8.4/man/ugrep.1 2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/man/ugrep.1 2026-09-15 13:41:49.000000000 +0200
@@ -1,4 +1,4 @@
-.TH UGREP "1" "August 05, 2026" "ugrep 7.8.4" "User Commands"
+.TH UGREP "1" "September 15, 2026" "ugrep 7.8.5" "User Commands"
 .SH NAME
 \fBugrep\fR, \fBug\fR -- file pattern searcher
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/cnf.cpp new/ugrep-7.8.5/src/cnf.cpp
--- old/ugrep-7.8.4/src/cnf.cpp 2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/cnf.cpp 2026-09-15 13:41:49.000000000 +0200
@@ -94,7 +94,7 @@
 
   bool parens = false;
 
-  if (*pattern == '(' && (flag_fixed_strings || pattern[1] != '?'))
+  if (*pattern == '(' && (flag_mode == Mode::FIXED || pattern[1] != '?'))
   {
     // check if matching ending ) is followed by spacing or EOS or |, then it 
is OK to parse '(' <parse1> ')' and convert to CNF
     int level = 0;
@@ -120,7 +120,7 @@
 
         --level;
       }
-      else if (*lookahead == '[' && !flag_fixed_strings)
+      else if (*lookahead == '[' && flag_mode != Mode::FIXED)
       {
         // skip [...]
         ++lookahead;
@@ -196,7 +196,7 @@
         }
 
         // if not -x then quote the string with \Q and \E
-        if (!flag_fixed_strings)
+        if (flag_mode != Mode::FIXED)
           quote(quoted);
 
         regex.append(quoted);
@@ -206,7 +206,7 @@
 
         pattern  = lookahead;
       }
-      else if (*lookahead == '[' && !flag_fixed_strings)
+      else if (*lookahead == '[' && flag_mode != Mode::FIXED)
       {
         // skip [...]
         ++lookahead;
@@ -256,7 +256,7 @@
 
     if (flag_line_regexp && regex.empty())
       regex.assign("^$");
-    else if (flag_fixed_strings)
+    else if (flag_mode == Mode::FIXED)
       quote(regex);
 
     // -w and -x
@@ -418,7 +418,7 @@
       {
         // pop unused ending '|' (or BRE '\|')
         terms.pop_back();
-        if (flag_basic_regexp)
+        if (flag_mode == Mode::BRE)
           terms.pop_back();
       }
     }
@@ -462,7 +462,7 @@
     else if (regex.empty())
       term.front()->clear(); // empty pattern means anything matches
     else
-      term.front()->append(flag_basic_regexp ? "\\|" : "|").append(regex);
+      term.front()->append(flag_mode == Mode::BRE ? "\\|" : "|").append(regex);
 
     // empty pattern means anything matches
     if (term.front()->empty())
@@ -492,7 +492,7 @@
     std::string spattern(pattern);
 
     // -F
-    if (flag_fixed_strings)
+    if (flag_mode == Mode::FIXED)
       quote(spattern);
 
     // -w and -x
@@ -526,7 +526,7 @@
       else if (spattern.empty())
         term.front()->clear(); // empty pattern means anything matches
       else
-        term.front()->append(flag_basic_regexp ? "\\|" : "|").append(spattern);
+        term.front()->append(flag_mode == Mode::BRE ? "\\|" : 
"|").append(spattern);
 
       // empty pattern means anything matches
       if (term.front()->empty())
@@ -566,7 +566,7 @@
   if (flag_bool)
     return;
 
-  const char *sep = flag_fixed_strings ? "\\E|\\Q" : flag_basic_regexp ? "\\|" 
: "|";
+  const char *sep = flag_mode == Mode::FIXED ? "\\E|\\Q" : flag_mode == 
Mode::BRE ? "\\|" : "|";
 
   for (auto& i : terms)
   {
@@ -644,7 +644,7 @@
 
     bool or_sep = false;
 
-    if (flag_fixed_strings)
+    if (flag_mode == Mode::FIXED)
       fprintf(output, "a string in ");
     else
       fprintf(output, "a pattern in ");
@@ -731,7 +731,7 @@
 std::string CNF::adjoin() const
 {
   std::string adjoined;
-  const char *sep = flag_basic_regexp ? "\\|" : "|";
+  const char *sep = flag_mode == Mode::BRE ? "\\|" : "|";
 
   if (flag_files)
   {
@@ -765,7 +765,7 @@
   {
     // pop unused ending '|' (or BRE '\|')
     adjoined.pop_back();
-    if (flag_basic_regexp)
+    if (flag_mode == Mode::BRE)
       adjoined.pop_back();
   }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/cnf.hpp new/ugrep-7.8.5/src/cnf.hpp
--- old/ugrep-7.8.4/src/cnf.hpp 2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/cnf.hpp 2026-09-15 13:41:49.000000000 +0200
@@ -178,14 +178,14 @@
     {
       // -x: make the regex line-anchored
       // -G requires \( \) instead of ( )
-      const char *xleft = flag_basic_regexp ? "^\\(" : "^(?:";
-      const char *xright = flag_basic_regexp ? "\\)$" : ")$";
+      const char *xleft = flag_mode == Mode::BRE ? "^\\(" : "^(?:";
+      const char *xright = flag_mode == Mode::BRE ? "\\)$" : ")$";
       pattern.insert(0, xleft).append(xright);
     }
     else if (flag_word_regexp)
     {
       // -w: make the regex word-anchored (or implicitly done with matcher 
option W instead of \< and \>)
-      if (flag_perl_regexp)
+      if (flag_mode == Mode::PERL)
       {
         // -P requires (?<!\w) (?!\w) instead of \< and \>
 #if defined(HAVE_PCRE2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/flag.hpp new/ugrep-7.8.5/src/flag.hpp
--- old/ugrep-7.8.4/src/flag.hpp        2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/flag.hpp        2026-09-15 13:41:49.000000000 +0200
@@ -68,10 +68,12 @@
 // -D, --devices and -d, --directories
 enum class Action { UNSP, SKIP, READ, RECURSE };
 
+// -E (default), -G, -F, -P matching modes
+enum class Mode { UNSP, ERE, BRE, FIXED, PERL };
+
 // ugrep command-line options
 extern bool flag_all_threads; // internal flag
 extern bool flag_any_line;
-extern bool flag_basic_regexp;
 extern bool flag_best_match;
 extern bool flag_bool;
 extern bool flag_color_term; // internal flag
@@ -85,7 +87,6 @@
 extern bool flag_files;
 extern bool flag_files_with_matches;
 extern bool flag_files_without_match;
-extern bool flag_fixed_strings;
 extern bool flag_glob_ignore_case;
 extern bool flag_grep; // internal flag
 extern bool flag_hex;
@@ -110,7 +111,6 @@
 extern bool flag_null_data;
 extern bool flag_only_line_number;
 extern bool flag_only_matching;
-extern bool flag_perl_regexp;
 extern bool flag_query;
 extern bool flag_quiet;
 extern bool flag_sort_rev; // internal flag
@@ -141,6 +141,7 @@
 extern Sort flag_sort_key; // internal flag
 extern Action flag_devices_action; // internal flag
 extern Action flag_directories_action; // internal flag
+extern Mode flag_mode;
 extern size_t flag_after_context;
 extern size_t flag_before_context;
 extern size_t flag_delay;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/query.cpp 
new/ugrep-7.8.5/src/query.cpp
--- old/ugrep-7.8.4/src/query.cpp       2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/query.cpp       2026-09-15 13:41:49.000000000 +0200
@@ -190,7 +190,7 @@
           ++look;
       }
     }
-    else if (!flag_fixed_strings)
+    else if (flag_mode != ::Mode::FIXED)
     {
       for (const char *look = line_; look < ptr; ++look)
       {
@@ -319,7 +319,7 @@
             ptr = ++next + 1;
           }
         }
-        else if (!flag_fixed_strings)
+        else if (flag_mode != ::Mode::FIXED)
         {
           if (ch == '[' && !list && !literal && !braced)
           {
@@ -387,7 +387,7 @@
           }
           else if (strchr("$()*+.?^|", ch) != NULL && !list && !literal && 
!braced)
           {
-            if (!flag_basic_regexp || strchr("()+?|", ch) == NULL)
+            if (flag_mode != ::Mode::BRE || strchr("()+?|", ch) == NULL)
             {
               Screen::put(ptr, next - ptr);
               Screen::normal();
@@ -420,7 +420,7 @@
             if (prev == ' ' || prev == '|' || prev == '(' || prev == -1)
             {
               if (ch == '-' ||
-                  (flag_fixed_strings && (ch == '(' || ch == ')' || ch == 
'|')) ||
+                  (flag_mode == ::Mode::FIXED && (ch == '(' || ch == ')' || ch 
== '|')) ||
                   strncmp(next, "AND ", 4) == 0 ||
                   strncmp(next, "OR ", 3) == 0 ||
                   strncmp(next, "NOT ", 4) == 0)
@@ -438,7 +438,7 @@
                 ch = ' ';
               }
             }
-            else if (flag_fixed_strings &&
+            else if (flag_mode == ::Mode::FIXED &&
                 (ch == '|' ||
                  (ch == ')' && (next + 1 >= end || next[1] == ' ' || next[1] 
== '|' || next[1] == ')'))))
             {
@@ -1949,7 +1949,7 @@
         error_ -= 4 + flag_ignore_case + flag_dotall + flag_free_space;
 
       // subtract 2 for -F
-      if (flag_fixed_strings && error_ >= 2)
+      if (flag_mode == ::Mode::FIXED && error_ >= 2)
         error_ -= 2;
 
       // subtract 2 or 3 for -x or -w
@@ -3936,8 +3936,8 @@
   flags_[2].flag = flag_byte_offset;
   flags_[3].flag = flag_after_context > 0 && flag_before_context > 0;
   flags_[4].flag = flag_count;
-  flags_[5].flag = flag_fixed_strings;
-  flags_[6].flag = flag_basic_regexp;
+  flags_[5].flag = flag_mode == ::Mode::FIXED;
+  flags_[6].flag = flag_mode == ::Mode::BRE;
   flags_[7].flag = !globs_.empty();
   flags_[8].flag = flag_with_filename;
   flags_[9].flag = flag_no_filename;
@@ -3948,7 +3948,7 @@
   flags_[14].flag = flag_files_with_matches;
   flags_[15].flag = flag_line_number;
   flags_[16].flag = flag_only_matching;
-  flags_[17].flag = flag_perl_regexp;
+  flags_[17].flag = flag_mode == ::Mode::PERL;
   flags_[18].flag = flag_directories_action == Action::RECURSE && 
flag_dereference;
   flags_[19].flag = flag_directories_action == Action::RECURSE && 
!flag_dereference;
   flags_[20].flag = flag_initial_tab;
@@ -4047,8 +4047,7 @@
   }
   flag_byte_offset = flags_[2].flag;
   flag_count = flags_[4].flag;
-  flag_fixed_strings = flags_[5].flag;
-  flag_basic_regexp = flags_[6].flag;
+  flag_mode = flags_[6].flag ? ::Mode::BRE : flags_[5].flag ? ::Mode::FIXED : 
flags_[17].flag ? ::Mode::PERL : ::Mode::ERE;
   flag_glob.clear();
   flag_iglob.clear();
   if (globbing_)
@@ -4065,7 +4064,6 @@
   flag_files_with_matches = flags_[14].flag;
   flag_line_number = flags_[15].flag;
   flag_only_matching = flags_[16].flag;
-  flag_perl_regexp = flags_[17].flag;
   if (flags_[18].flag)
     flag_directories_action = Action::RECURSE, flag_dereference = true;
   else if (flags_[19].flag)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/stats.cpp 
new/ugrep-7.8.5/src/stats.cpp
--- old/ugrep-7.8.4/src/stats.cpp       2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/stats.cpp       2026-09-15 13:41:49.000000000 +0200
@@ -100,16 +100,18 @@
     for (const auto& i : flag_config_files)
       fprintf(output, "    using %s" NEWLINESTR, i.c_str());
   }
+  if (flag_fuzzy > 0)
+    fprintf(output, "  --fuzzy" NEWLINESTR);
   if (flag_bool)
     fprintf(output, "  --bool %s" NEWLINESTR, (flag_files ? "--files" : 
"--lines"));
-  if (flag_basic_regexp)
+  if (flag_mode == Mode::BRE)
     fprintf(output, "  --basic-regexp" NEWLINESTR);
-  else if (flag_fixed_strings)
+  else if (flag_mode == Mode::FIXED)
     fprintf(output, "  --fixed-strings" NEWLINESTR);
-  else if (flag_fuzzy > 0)
-    fprintf(output, "  --fuzzy" NEWLINESTR);
-  else if (flag_perl_regexp)
+  else if (flag_mode == Mode::PERL)
     fprintf(output, "  --perl-regexp" NEWLINESTR);
+  else
+    fprintf(output, "  --extended-regexp" NEWLINESTR);
   if (flag_decompress)
     fprintf(output, "  --decompress --zmax=%zu" NEWLINESTR, flag_zmax);
   if (flag_min_depth > 0 && flag_max_depth > 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep-indexer.cpp 
new/ugrep-7.8.5/src/ugrep-indexer.cpp
--- old/ugrep-7.8.4/src/ugrep-indexer.cpp       2026-08-05 16:31:46.000000000 
+0200
+++ new/ugrep-7.8.5/src/ugrep-indexer.cpp       2026-09-15 13:41:49.000000000 
+0200
@@ -35,7 +35,7 @@
 */
 
 // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically 
here for MSVC++ build from source
-#define UGREP_VERSION "7.8.4"
+#define UGREP_VERSION "7.8.5"
 
 // use a task-parallel thread to decompress the stream into a pipe to search, 
also handles nested archives
 #define WITH_DECOMPRESSION_THREAD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep.cpp 
new/ugrep-7.8.5/src/ugrep.cpp
--- old/ugrep-7.8.4/src/ugrep.cpp       2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/ugrep.cpp       2026-09-15 13:41:49.000000000 +0200
@@ -303,7 +303,6 @@
 // ugrep command-line options
 bool flag_all_threads              = false;
 bool flag_any_line                 = false;
-bool flag_basic_regexp             = false;
 bool flag_best_match               = false;
 bool flag_bool                     = false;
 bool flag_color_term               = false;
@@ -317,7 +316,6 @@
 bool flag_files                    = false;
 bool flag_files_with_matches       = false;
 bool flag_files_without_match      = false;
-bool flag_fixed_strings            = false;
 bool flag_glob_ignore_case         = false;
 bool flag_grep                     = false;
 bool flag_hex                      = false;
@@ -342,7 +340,6 @@
 bool flag_null_data                = false;
 bool flag_only_line_number         = false;
 bool flag_only_matching            = false;
-bool flag_perl_regexp              = false;
 bool flag_query                    = false;
 bool flag_quiet                    = false;
 bool flag_sort_rev                 = false;
@@ -373,6 +370,7 @@
 Sort flag_sort_key                 = Sort::NA;
 Action flag_devices_action         = Action::UNSP;
 Action flag_directories_action     = Action::UNSP;
+Mode flag_mode                     = Mode::UNSP;
 size_t flag_after_context          = 0;
 size_t flag_before_context         = 0;
 size_t flag_delay                  = DEFAULT_QUERY_DELAY;
@@ -3971,7 +3969,7 @@
 
 #if !defined(HAVE_PCRE2) && defined(HAVE_BOOST_REGEX)
       // buffer all input to work around Boost.Regex partial matching bug, but 
this may throw std::bad_alloc if the file is too large
-      if (flag_perl_regexp)
+      if (flag_mode == Mode::PERL)
       {
         matcher->buffer();
       }
@@ -4937,9 +4935,14 @@
 
         options(pattern_args, 2, args);
 
-        if (Static::warnings > 0)
+        if (Static::warnings > 0 ||
+            flag_bool || flag_fuzzy || flag_mode != Mode::UNSP ||
+            flag_any_line || flag_count || flag_files_with_matches || 
flag_files_without_match ||
+            flag_invert_match || flag_line_regexp || flag_only_line_number || 
flag_only_matching ||
+            flag_replace || flag_text || flag_word_regexp)
         {
-          std::cerr << "ugrep: error in " << config_file << " at line " << 
lineno << '\n';
+          // reject invalid options and options that don't make sense for 
config
+          std::cerr << "ugrep: error in config file " << config_file << " at 
line " << lineno << '\n';
           errors = true;
         }
         else if (line.compare(0, 8, "--config") == 0)
@@ -4947,7 +4950,7 @@
           // parse a config file, but do not recurse more than one level deep
           if (recurse)
           {
-            std::cerr << "ugrep: recursive configuration in " << config_file 
<< " at line " << lineno << '\n';
+            std::cerr << "ugrep: error in config file " << config_file << " 
recursion at line " << lineno << '\n';
             errors = true;
           }
           else
@@ -4971,19 +4974,9 @@
       ++lineno;
     }
 
-    // clear flags that don't make sense for config, clashing and confusing to 
allow
-    flag_any_line = false;
-    flag_basic_regexp = false;
-    flag_bool = false;
-    flag_count = false;
+    // silently ignore some options that don't make sense for config, clashing 
and confusing to allow
     flag_file.clear();
-    flag_files_with_matches = false;
-    flag_files_without_match = false;
-    flag_fixed_strings = false;
     flag_from.clear();
-    flag_fuzzy = 0;
-    flag_invert_match = false;
-    flag_line_regexp = false;
     flag_match = false;
     flag_max_count = 0;
     flag_max_files = 0;
@@ -4991,17 +4984,11 @@
     flag_max_size = 0;
     flag_min_line = 0;
     flag_min_size = 0;
-    flag_only_line_number = false;
-    flag_only_matching = false;
     flag_pager = NULL;
-    flag_perl_regexp = false;
     flag_query = false;
     flag_quiet = false;
     flag_regexp.clear();
-    flag_replace = NULL;
     flag_save_config = NULL;
-    flag_text = false;
-    flag_word_regexp = false;
     if (wdir)
     {
       flag_view = NULL;
@@ -5351,7 +5338,7 @@
 
               case 'b':
                 if (strcmp(arg, "basic-regexp") == 0)
-                  flag_basic_regexp = true;
+                  flag_mode = Mode::BRE;
                 else if (strcmp(arg, "before-context") == 0) // legacy form 
--before-context NUM
                   flag_before_context = strtonum(getloptarg(argc, argv, "", 
i), "invalid argument --before-context=");
                 else if (strncmp(arg, "before-context=", 15) == 0)
@@ -5462,7 +5449,7 @@
                 else if (strncmp(arg, "exclude-fs=", 11) == 0)
                   flag_exclude_fs.emplace_back(getloptarg(argc, argv, arg + 
11, i));
                 else if (strcmp(arg, "extended-regexp") == 0)
-                  flag_basic_regexp = false;
+                  flag_mode = Mode::ERE;
                 else if (strcmp(arg, "encoding") == 0)
                   usage("missing argument for --", arg);
                 else
@@ -5487,7 +5474,7 @@
                 else if (strcmp(arg, "files-without-match") == 0)
                   flag_files_without_match = true;
                 else if (strcmp(arg, "fixed-strings") == 0)
-                  flag_fixed_strings = true;
+                  flag_mode = Mode::FIXED;
                 else if (strncmp(arg, "filter=", 7) == 0)
                   flag_filter.append(flag_filter.empty() ? "" : 
",").append(getloptarg(argc, argv, arg + 7, i));
                 else if (strncmp(arg, "filter-magic-label=", 19) == 0)
@@ -5803,7 +5790,7 @@
                 else if (strcmp(arg, "passthru") == 0)
                   flag_any_line = true;
                 else if (strcmp(arg, "perl-regexp") == 0)
-                  flag_perl_regexp = true;
+                  flag_mode = Mode::PERL;
                 else if (strcmp(arg, "pretty") == 0)
                   flag_pretty = Static::AUTO;
                 else if (strncmp(arg, "pretty=", 7) == 0)
@@ -5980,7 +5967,7 @@
             break;
 
           case 'E':
-            flag_basic_regexp = false;
+            flag_mode = Mode::ERE;
             break;
 
           case 'e':
@@ -5989,7 +5976,7 @@
             break;
 
           case 'F':
-            flag_fixed_strings = true;
+            flag_mode = Mode::FIXED;
             break;
 
           case 'f':
@@ -5998,7 +5985,7 @@
             break;
 
           case 'G':
-            flag_basic_regexp = true;
+            flag_mode = Mode::BRE;
             break;
 
           case 'g':
@@ -6077,7 +6064,7 @@
             break;
 
           case 'P':
-            flag_perl_regexp = true;
+            flag_mode = Mode::PERL;
             break;
 
           case 'p':
@@ -6449,7 +6436,7 @@
   else if (strncmp(program, "grep", len) == 0)
   {
     // the 'grep' command is equivalent to 'ugrep --grep -G -. --sort'
-    flag_basic_regexp = true;
+    flag_mode = Mode::BRE;
     flag_grep = true;
     flag_empty = true;
     flag_hidden = true;
@@ -6466,7 +6453,7 @@
   else if (strncmp(program, "fgrep", len) == 0)
   {
     // the 'fgrep' command is equivalent to 'ugrep --grep -F -. --sort'
-    flag_fixed_strings = true;
+    flag_mode = Mode::FIXED;
     flag_grep = true;
     flag_empty = true;
     flag_hidden = true;
@@ -6476,7 +6463,7 @@
   {
     // the 'zgrep' command is equivalent to 'ugrep --decompress --grep -G -. 
--sort'
     flag_decompress = true;
-    flag_basic_regexp = true;
+    flag_mode = Mode::BRE;
     flag_grep = true;
     flag_empty = true;
     flag_hidden = true;
@@ -6495,7 +6482,7 @@
   {
     // the 'zfgrep' command is equivalent to 'ugrep --decompress --grep -F -. 
--sort'
     flag_decompress = true;
-    flag_fixed_strings = true;
+    flag_mode = Mode::FIXED;
     flag_grep = true;
     flag_empty = true;
     flag_hidden = true;
@@ -6540,12 +6527,10 @@
   if (flag_zmax > 99)
     usage("option --zmax argument exceeds upper limit");
 
-  // -P disables -F, -G and -Z (P>F>G>E override) and does not allow -N 
patterns
-  if (flag_perl_regexp)
+  // -P is incompatible with option -Z and with -N patterns
+  if (flag_mode == Mode::PERL)
   {
 #if defined(HAVE_PCRE2) || defined(HAVE_BOOST_REGEX)
-    flag_fixed_strings = false;
-    flag_basic_regexp = false;
     if (flag_fuzzy > 0)
       usage("options -P and -Z are not compatible");
     for (const auto& arg : pattern_args)
@@ -6560,10 +6545,6 @@
   if (flag_only_matching || flag_ungroup)
     flag_empty = false;
 
-  // -F disables -G (P>F>G>E override)
-  if (flag_fixed_strings)
-    flag_basic_regexp = false;
-
   // -e, -N, --and, --andnot, --not
   if (!pattern_args.empty())
   {
@@ -6574,7 +6555,7 @@
       {
         if (arg.first == CNF::PATTERN::AND || arg.first == CNF::PATTERN::NOT)
           flag_bool = true;
-        else if (arg.first == CNF::PATTERN::NEG && flag_fixed_strings)
+        else if (arg.first == CNF::PATTERN::NEG && flag_mode == Mode::FIXED)
           usage("option -F with -% or -Q does not support -N PATTERN");
       }
 
@@ -8425,8 +8406,8 @@
   if (!flag_file.empty())
   {
     // -F: make newline-separated lines in regex literal with \Q and \E
-    bool fixed_strings = flag_fixed_strings;
-    const char *bar = flag_basic_regexp ? "\\|" : "|";
+    bool fixed_strings = flag_mode == Mode::FIXED;
+    const char *bar = flag_mode == Mode::BRE ? "\\|" : "|";
 
     // PATTERN or -e PATTERN: add an ending '|' (or BRE '\|') to the regex to 
concatenate sub-expressions
     if (!regex.empty())
@@ -8519,7 +8500,7 @@
     {
       // pop unused ending '|' (or BRE '\|') from the |-concatenated regexes 
in the regex string
       regex.pop_back();
-      if (flag_basic_regexp)
+      if (flag_mode == Mode::BRE)
         regex.pop_back();
     }
 
@@ -8528,7 +8509,7 @@
   }
 
   // patterns ^, $ and ^$ are special cases to optimize for search
-  if (!flag_fixed_strings && Static::bcnf.singleton_or_undefined())
+  if (flag_mode != Mode::FIXED && Static::bcnf.singleton_or_undefined())
   {
     if (regex == "^$")
     {
@@ -8592,7 +8573,7 @@
   }
 
   // patterns .* and .+ are common easy special cases to optimize for search
-  if (!flag_fixed_strings && !flag_dotall && 
Static::bcnf.singleton_or_undefined())
+  if (flag_mode != Mode::FIXED && !flag_dotall && 
Static::bcnf.singleton_or_undefined())
   {
     if (regex == ".*")
     {
@@ -8760,7 +8741,7 @@
     convert_flags |= reflex::convert_flag::unicode;
 
   // -G: convert basic regex (BRE) to extended regex (ERE)
-  if (flag_basic_regexp)
+  if (flag_mode == Mode::BRE)
     convert_flags |= reflex::convert_flag::basic;
 
   // set reflex::Pattern options to enable multiline mode
@@ -8788,8 +8769,8 @@
   // reflex::Matcher options
   std::string matcher_options;
 
-  // grep compatibility mode: literally match closing ) like GNU grep when not 
paired with ( unless -P or -F
-  if (flag_grep && !flag_perl_regexp && !flag_fixed_strings)
+  // grep compatibility mode: literally match closing ) like GNU grep when not 
paired with ( unless -F or -P
+  if (flag_grep && flag_mode != Mode::FIXED && flag_mode != Mode::PERL)
     convert_flags |= reflex::convert_flag::closing;
 
   // -Y or --empty: permit empty pattern matches
@@ -8811,7 +8792,7 @@
   // --index: search is only possible with compatible options
   if (flag_index != NULL)
   {
-    if (flag_perl_regexp)
+    if (flag_mode == Mode::PERL)
       usage("options --index and -P (--perl-regexp) are not compatible");
     if (!flag_filter.empty())
       usage("options --index and --filter are not compatible");
@@ -8870,7 +8851,7 @@
       }
     }
   }
-  else if (flag_perl_regexp)
+  else if (flag_mode == Mode::PERL)
   {
     // -P: Perl matching with PCRE2 or Boost.Regex
 #if defined(HAVE_PCRE2)
@@ -13533,7 +13514,7 @@
 
 #if !defined(HAVE_PCRE2) && defined(HAVE_BOOST_REGEX)
   // buffer all input to work around Boost.Regex partial matching bug, but 
this may throw std::bad_alloc if the file is too large
-  if (flag_perl_regexp)
+  if (flag_mode == Mode::PERL)
     matcher->buffer();
 #endif
 
@@ -15261,7 +15242,7 @@
 #endif
   std::cout << "ugrep " UGREP_VERSION;
   if (flag_grep)
-    std::cout << " (" << (flag_basic_regexp ? "" : flag_fixed_strings ? "f" : 
"e") << "grep compat)";
+    std::cout << " (" << (flag_mode == Mode::BRE ? "" : flag_mode == 
Mode::FIXED ? "f" : "e") << "grep compat)";
   std::cout << " " PLATFORM <<
 #if defined(HAVE_AVX512BW)
     (reflex::have_HW_AVX512BW() ? " +avx512" : (reflex::have_HW_AVX2() ? " 
+avx2" : reflex::have_HW_SSE2() ?  " +sse2" : " (no sse2!)")) <<
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/ugrep.hpp 
new/ugrep-7.8.5/src/ugrep.hpp
--- old/ugrep-7.8.4/src/ugrep.hpp       2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/ugrep.hpp       2026-09-15 13:41:49.000000000 +0200
@@ -38,7 +38,7 @@
 #define UGREP_HPP
 
 // DO NOT ALTER THIS LINE: updated by makemake.sh and we need it physically 
here for MSVC++ build from source
-#define UGREP_VERSION "7.8.4"
+#define UGREP_VERSION "7.8.5"
 
 // disable mmap because mmap is almost always slower than the file reading 
speed improvements since 3.0.0
 #define WITH_NO_MMAP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ugrep-7.8.4/src/zstream.hpp 
new/ugrep-7.8.5/src/zstream.hpp
--- old/ugrep-7.8.4/src/zstream.hpp     2026-08-05 16:31:46.000000000 +0200
+++ new/ugrep-7.8.5/src/zstream.hpp     2026-09-15 13:41:49.000000000 +0200
@@ -524,7 +524,7 @@
         lzma_strm_->avail_in = zlen_ - zcur_;
 
         // initialize lzma decompress
-        lzma_ret ret = lzma_auto_decoder(lzma_strm_, UINT64_MAX, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
+        lzma_ret ret = lzma_auto_decoder(lzma_strm_, XZ::MEMLIMIT, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
         if (ret != LZMA_OK)
         {
           cannot_decompress(pathname_, "lzma_auto_decoder failed");
@@ -1229,7 +1229,7 @@
       try
       {
         xzfile_ = new XZ();
-        lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, UINT64_MAX, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
+        lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, XZ::MEMLIMIT, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
         if (ret != LZMA_OK)
         {
           warning("lzma_stream_decoder failed", pathname);
@@ -1547,7 +1547,7 @@
                 xzfile_ = new XZ();
                 xzfile_->strm.next_in  = buf_;
                 xzfile_->strm.avail_in = 6;
-                lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, UINT64_MAX, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
+                lzma_ret ret = lzma_auto_decoder(&xzfile_->strm, XZ::MEMLIMIT, 
LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED);
                 if (ret != LZMA_OK)
                 {
                   warning("lzma_stream_decoder failed", pathname);
@@ -1839,6 +1839,8 @@
       lzma_end(&strm);
     }
 
+    static const uint64_t MEMLIMIT = 100 * 1024 * 1024; // 100 MB: files 
compressed with 'xz -9' require 65 MB to decompress
+
     lzma_stream   strm;
     unsigned char zbuf[Z_BUF_LEN];
     size_t        zlen;

++++++ ugrep.obsinfo ++++++
--- /var/tmp/diff_new_pack.nT0a5X/_old  2026-09-16 17:48:27.295334164 +0200
+++ /var/tmp/diff_new_pack.nT0a5X/_new  2026-09-16 17:48:27.302334457 +0200
@@ -1,5 +1,5 @@
 name: ugrep
-version: 7.8.4
-mtime: 1785940306
-commit: 550599a6434fc5315fb6ecd415a5d859e6d846a8
+version: 7.8.5
+mtime: 1789472509
+commit: f2cc252c011460f6c75b1fb591813b4b6b59c225
 

Reply via email to