Bug#1029100: libxpm: diff for NMU version 1:3.5.12-1.1
Package: libxpm
Version: 1:3.5.12-1
Severity: normal
Tags: patch pending
X-Debbugs-CC: pochu@debian.org,jcristau@debian.org
Dear maintainer,
I've prepared an NMU for libxpm (versioned as 1:3.5.12-1.1) and
uploaded it to DELAYED/2. Please feel free to tell me if I
should delay it longer.
Regards,
Salvatore
diff -u libxpm-3.5.12/debian/changelog libxpm-3.5.12/debian/changelog
--- libxpm-3.5.12/debian/changelog
+++ libxpm-3.5.12/debian/changelog
@@ -1,3 +1,17 @@
+libxpm (1:3.5.12-1.1) unstable; urgency=medium
+
+ * Non-maintainer upload.
+ * Fix CVE-2022-46285: Infinite loop on unclosed comments
+ * Fix CVE-2022-44617: Runaway loop with width of 0 and enormous height
+ * configure: add --disable-open-zfile instead of requiring -DNO_ZPIPE
+ * Fix CVE-2022-4883: compression commands depend on $PATH
+ * Prevent a double free in the error code path
+ * Use gzip -d instead of gunzip
+ * debian/rules: configure: Set explicitly runtime paths for {,un}compress
+ and gzip.
+
+ -- Salvatore Bonaccorso <carnil@debian.org> Mon, 16 Jan 2023 21:01:44 +0100
+
libxpm (1:3.5.12-1) unstable; urgency=medium
[ Andreas Boll ]
diff -u libxpm-3.5.12/debian/patches/series libxpm-3.5.12/debian/patches/series
--- libxpm-3.5.12/debian/patches/series
+++ libxpm-3.5.12/debian/patches/series
@@ -1 +1,6 @@
-# placeholder
+Fix-CVE-2022-46285-Infinite-loop-on-unclosed-comment.patch
+Fix-CVE-2022-44617-Runaway-loop-with-width-of-0-and-.patch
+configure-add-disable-open-zfile-instead-of-requirin.patch
+Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
+Prevent-a-double-free-in-the-error-code-path.patch
+Use-gzip-d-instead-of-gunzip.patch
diff -u libxpm-3.5.12/debian/rules libxpm-3.5.12/debian/rules
--- libxpm-3.5.12/debian/rules
+++ libxpm-3.5.12/debian/rules
@@ -4,4 +4,7 @@
dh $@ --with quilt --builddirectory=build/
+override_dh_auto_configure:
+ dh_auto_configure -- XPM_PATH_COMPRESS=/usr/bin/compress XPM_PATH_UNCOMPRESS=/bin/uncompress XPM_PATH_GZIP=/bin/gzip
+
override_dh_install:
dh_install --fail-missing -XlibXpm.la
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/Fix-CVE-2022-44617-Runaway-loop-with-width-of-0-and-.patch
+++ libxpm-3.5.12/debian/patches/Fix-CVE-2022-44617-Runaway-loop-with-width-of-0-and-.patch
@@ -0,0 +1,150 @@
+From 198839ca64dc117b35339f38c83d483ab6b561b6 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Sat, 7 Jan 2023 12:44:28 -0800
+Subject: Fix CVE-2022-44617: Runaway loop with width of 0 and enormous height
+
+When reading XPM images from a file with libXpm 3.5.14 or older, if a
+image has a width of 0 and a very large height, the ParsePixels() function
+will loop over the entire height calling getc() and ungetc() repeatedly,
+or in some circumstances, may loop seemingly forever, which may cause a
+denial of service to the calling program when given a small crafted XPM
+file to parse.
+
+Closes: #2
+
+Reported-by: Martin Ettl <ettl.martin78@googlemail.com>
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+ src/data.c | 20 ++++++++++++++------
+ src/parse.c | 31 +++++++++++++++++++++++++++----
+ 2 files changed, 41 insertions(+), 10 deletions(-)
+
+diff --git a/src/data.c b/src/data.c
+index bfad4ff..7524e65 100644
+--- a/src/data.c
++++ b/src/data.c
+@@ -195,19 +195,23 @@ xpmNextString(xpmData *data)
+ register char c;
+
+ /* get to the end of the current string */
+- if (data->Eos)
+- while ((c = *data->cptr++) && c != data->Eos);
++ if (data->Eos) {
++ while ((c = *data->cptr++) && c != data->Eos && c != '\0');
++
++ if (c == '\0')
++ return XpmFileInvalid;
++ }
+
+ /*
+ * then get to the beginning of the next string looking for possible
+ * comment
+ */
+ if (data->Bos) {
+- while ((c = *data->cptr++) && c != data->Bos)
++ while ((c = *data->cptr++) && c != data->Bos && c != '\0')
+ if (data->Bcmt && c == data->Bcmt[0])
+ ParseComment(data);
+ } else if (data->Bcmt) { /* XPM2 natural */
+- while ((c = *data->cptr++) == data->Bcmt[0])
++ while (((c = *data->cptr++) == data->Bcmt[0]) && c != '\0')
+ ParseComment(data);
+ data->cptr--;
+ }
+@@ -216,9 +220,13 @@ xpmNextString(xpmData *data)
+ FILE *file = data->stream.file;
+
+ /* get to the end of the current string */
+- if (data->Eos)
++ if (data->Eos) {
+ while ((c = Getc(data, file)) != data->Eos && c != EOF);
+
++ if (c == EOF)
++ return XpmFileInvalid;
++ }
++
+ /*
+ * then get to the beginning of the next string looking for possible
+ * comment
+@@ -234,7 +242,7 @@ xpmNextString(xpmData *data)
+ Ungetc(data, c, file);
+ }
+ }
+- return 0;
++ return XpmSuccess;
+ }
+
+
+diff --git a/src/parse.c b/src/parse.c
+index 037fc66..64f51ba 100644
+--- a/src/parse.c
++++ b/src/parse.c
+@@ -427,6 +427,13 @@ ParsePixels(
+ {
+ unsigned int *iptr, *iptr2 = NULL; /* found by Egbert Eich */
+ unsigned int a, x, y;
++ int ErrorStatus;
++
++ if ((width == 0) && (height != 0))
++ return (XpmFileInvalid);
++
++ if ((height == 0) && (width != 0))
++ return (XpmFileInvalid);
+
+ if ((height > 0 && width >= UINT_MAX / height) ||
+ width * height >= UINT_MAX / sizeof(unsigned int))
+@@ -464,7 +471,11 @@ ParsePixels(
+ colidx[(unsigned char)colorTable[a].string[0]] = a + 1;
+
+ for (y = 0; y < height; y++) {
+- xpmNextString(data);
++ ErrorStatus = xpmNextString(data);
++ if (ErrorStatus != XpmSuccess) {
++ XpmFree(iptr2);
++ return (ErrorStatus);
++ }
+ for (x = 0; x < width; x++, iptr++) {
+ int c = xpmGetC(data);
+
+@@ -511,7 +522,11 @@ do \
+ }
+
+ for (y = 0; y < height; y++) {
+- xpmNextString(data);
++ ErrorStatus = xpmNextString(data);
++ if (ErrorStatus != XpmSuccess) {
++ XpmFree(iptr2);
++ return (ErrorStatus);
++ }
+ for (x = 0; x < width; x++, iptr++) {
+ int cc1 = xpmGetC(data);
+ if (cc1 > 0 && cc1 < 256) {
+@@ -551,7 +566,11 @@ do \
+ xpmHashAtom *slot;
+
+ for (y = 0; y < height; y++) {
+- xpmNextString(data);
++ ErrorStatus = xpmNextString(data);
++ if (ErrorStatus != XpmSuccess) {
++ XpmFree(iptr2);
++ return (ErrorStatus);
++ }
+ for (x = 0; x < width; x++, iptr++) {
+ for (a = 0, s = buf; a < cpp; a++, s++) {
+ int c = xpmGetC(data);
+@@ -571,7 +590,11 @@ do \
+ }
+ } else {
+ for (y = 0; y < height; y++) {
+- xpmNextString(data);
++ ErrorStatus = xpmNextString(data);
++ if (ErrorStatus != XpmSuccess) {
++ XpmFree(iptr2);
++ return (ErrorStatus);
++ }
+ for (x = 0; x < width; x++, iptr++) {
+ for (a = 0, s = buf; a < cpp; a++, s++) {
+ int c = xpmGetC(data);
+--
+2.15.2
+
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/Fix-CVE-2022-46285-Infinite-loop-on-unclosed-comment.patch
+++ libxpm-3.5.12/debian/patches/Fix-CVE-2022-46285-Infinite-loop-on-unclosed-comment.patch
@@ -0,0 +1,36 @@
+From 4636007dd4cebca8ee10738a7833f629d8687529 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Sat, 17 Dec 2022 12:23:45 -0800
+Subject: Fix CVE-2022-46285: Infinite loop on unclosed comments
+
+When reading XPM images from a file with libXpm 3.5.14 or older, if a
+comment in the file is not closed (i.e. a C-style comment starts with
+"/*" and is missing the closing "*/"), the ParseComment() function will
+loop forever calling getc() to try to read the rest of the comment,
+failing to notice that it has returned EOF, which may cause a denial of
+service to the calling program.
+
+Reported-by: Marco Ivaldi <raptor@0xdeadbeef.info>
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+ src/data.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/data.c b/src/data.c
+index 898889c..bfad4ff 100644
+--- a/src/data.c
++++ b/src/data.c
+@@ -174,6 +174,10 @@ ParseComment(xpmData *data)
+ notend = 0;
+ Ungetc(data, *s, file);
+ }
++ else if (c == EOF) {
++ /* hit end of file before the end of the comment */
++ return XpmFileInvalid;
++ }
+ }
+ return 0;
+ }
+--
+2.15.2
+
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
+++ libxpm-3.5.12/debian/patches/Fix-CVE-2022-4883-compression-commands-depend-on-PAT.patch
@@ -0,0 +1,114 @@
+From 082a080672c3b8a964aa8100bee41930e12b03fa Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Fri, 6 Jan 2023 12:50:48 -0800
+Subject: Fix CVE-2022-4883: compression commands depend on $PATH
+
+By default, on all platforms except MinGW, libXpm will detect if a
+filename ends in .Z or .gz, and will when reading such a file fork off
+an uncompress or gunzip command to read from via a pipe, and when
+writing such a file will fork off a compress or gzip command to write
+to via a pipe.
+
+In libXpm 3.5.14 or older these are run via execlp(), relying on $PATH
+to find the commands. If libXpm is called from a program running with
+raised privileges, such as via setuid, then a malicious user could set
+$PATH to include programs of their choosing to be run with those
+privileges.
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+ README.md | 12 ++++++++++++
+ configure.ac | 14 ++++++++++++++
+ src/RdFToI.c | 17 ++++++++++++++---
+ src/WrFFrI.c | 4 ++--
+ 4 files changed, 42 insertions(+), 5 deletions(-)
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -48,6 +48,14 @@ if test "x$USE_GETTEXT" = "xyes" ; then
+ fi
+ AM_CONDITIONAL(USE_GETTEXT, test "x$USE_GETTEXT" = "xyes")
+
++dnl Helper macro to find absolute path to program and add a #define for it
++AC_DEFUN([XPM_PATH_PROG],[
++AC_PATH_PROG([$1], [$2], [])
++AS_IF([test "x$$1" = "x"],
++ [AC_MSG_ERROR([$2 not found, set $1 or use --disable-stat-zfile])])
++AC_DEFINE_UNQUOTED([$1], ["$$1"], [Path to $2])
++]) dnl End of AC_DEFUN([XPM_PATH_PROG]...
++
+ # Optional feature: When a filename ending in .Z or .gz is requested,
+ # open a pipe to a newly forked compress/uncompress/gzip/gunzip command to
+ # handle it.
+@@ -63,6 +71,12 @@ AC_ARG_ENABLE(open-zfile,
+ AC_MSG_RESULT([$OPEN_ZFILE])
+ if test x$OPEN_ZFILE = xno ; then
+ AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes])
++else
++ XPM_PATH_PROG([XPM_PATH_COMPRESS], [compress])
++ XPM_PATH_PROG([XPM_PATH_UNCOMPRESS], [uncompress])
++ XPM_PATH_PROG([XPM_PATH_GZIP], [gzip])
++ XPM_PATH_PROG([XPM_PATH_GUNZIP], [gunzip])
++ AC_CHECK_FUNCS([closefrom close_range], [break])
+ fi
+
+ # Optional feature: When ___.xpm is requested, also look for ___.xpm.Z & .gz
+--- a/src/RdFToI.c
++++ b/src/RdFToI.c
+@@ -43,6 +43,7 @@
+ #include <errno.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
++#include <unistd.h>
+ #else
+ #ifdef FOR_MSW
+ #include <fcntl.h>
+@@ -161,7 +162,17 @@ xpmPipeThrough(
+ goto err;
+ if ( 0 == pid )
+ {
+- execlp(cmd, cmd, arg1, (char *)NULL);
++#ifdef HAVE_CLOSEFROM
++ closefrom(3);
++#elif defined(HAVE_CLOSE_RANGE)
++# ifdef CLOSE_RANGE_UNSHARE
++# define close_range_flags CLOSE_RANGE_UNSHARE
++# else
++# define close_range_flags 0
++#endif
++ close_range(3, ~0U, close_range_flags);
++#endif
++ execl(cmd, cmd, arg1, (char *)NULL);
+ perror(cmd);
+ goto err;
+ }
+@@ -235,12 +246,12 @@ OpenReadFile(
+ if ( ext && !strcmp(ext, ".Z") )
+ {
+ mdata->type = XPMPIPE;
+- mdata->stream.file = xpmPipeThrough(fd, "uncompress", "-c", "r");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_UNCOMPRESS, "-c", "r");
+ }
+ else if ( ext && !strcmp(ext, ".gz") )
+ {
+ mdata->type = XPMPIPE;
+- mdata->stream.file = xpmPipeThrough(fd, "gunzip", "-qc", "r");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GUNZIP, "-qc", "r");
+ }
+ else
+ #endif /* z-files */
+--- a/src/WrFFrI.c
++++ b/src/WrFFrI.c
+@@ -336,10 +336,10 @@ OpenWriteFile(
+ #ifndef NO_ZPIPE
+ len = strlen(filename);
+ if (len > 2 && !strcmp(".Z", filename + (len - 2))) {
+- mdata->stream.file = xpmPipeThrough(fd, "compress", NULL, "w");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_COMPRESS, NULL, "w");
+ mdata->type = XPMPIPE;
+ } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) {
+- mdata->stream.file = xpmPipeThrough(fd, "gzip", "-q", "w");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-q", "w");
+ mdata->type = XPMPIPE;
+ } else
+ #endif
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/Prevent-a-double-free-in-the-error-code-path.patch
+++ libxpm-3.5.12/debian/patches/Prevent-a-double-free-in-the-error-code-path.patch
@@ -0,0 +1,39 @@
+From 1b01c4424bec256116f8e8283430eb241e3f5d99 Mon Sep 17 00:00:00 2001
+From: Matthieu Herrb <matthieu@herrb.eu>
+Date: Thu, 12 Jan 2023 15:05:39 +1000
+Subject: Prevent a double free in the error code path
+
+xpmParseDataAndCreate() calls XDestroyImage() in the error path.
+Reproducible with sxpm "zero-width.xpm", that file is in the test/
+directory.
+
+The same approach is needed in the bytes_per_line == 0 condition though
+here it just plugs a memory leak.
+---
+ src/create.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/create.c b/src/create.c
+index 4a85c78..f92ffef 100644
+--- a/src/create.c
++++ b/src/create.c
+@@ -994,11 +994,15 @@ CreateXImage(
+ #if !defined(FOR_MSW) && !defined(AMIGA)
+ if (height != 0 && (*image_return)->bytes_per_line >= INT_MAX / height) {
+ XDestroyImage(*image_return);
++ *image_return = NULL;
+ return XpmNoMemory;
+ }
+ /* now that bytes_per_line must have been set properly alloc data */
+- if((*image_return)->bytes_per_line == 0 || height == 0)
++ if((*image_return)->bytes_per_line == 0 || height == 0) {
++ XDestroyImage(*image_return);
++ *image_return = NULL;
+ return XpmNoMemory;
++ }
+ (*image_return)->data =
+ (char *) XpmMalloc((*image_return)->bytes_per_line * height);
+
+--
+2.39.0
+
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/Use-gzip-d-instead-of-gunzip.patch
+++ libxpm-3.5.12/debian/patches/Use-gzip-d-instead-of-gunzip.patch
@@ -0,0 +1,58 @@
+From 8178eb0834d82242e1edbc7d4fb0d1b397569c68 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Mon, 16 Jan 2023 19:44:52 +1000
+Subject: Use gzip -d instead of gunzip
+
+GNU gunzip [1] is a shell script that exec's `gzip -d`. Even if we call
+/usr/bin/gunzip with the correct built-in path, the actual gzip call
+will use whichever gzip it finds first, making our patch pointless.
+
+Fix this by explicitly calling gzip -d instead.
+
+https://git.savannah.gnu.org/cgit/gzip.git/tree/gunzip.in
+
+[Part of the fix for CVE-2022-4883]
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+ README.md | 2 +-
+ configure.ac | 3 +--
+ src/RdFToI.c | 2 +-
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index e6b6509..6cd165f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -58,7 +58,7 @@ AC_DEFINE_UNQUOTED([$1], ["$$1"], [Path to $2])
+ ]) dnl End of AC_DEFUN([XPM_PATH_PROG]...
+
+ # Optional feature: When a filename ending in .Z or .gz is requested,
+-# open a pipe to a newly forked compress/uncompress/gzip/gunzip command to
++# open a pipe to a newly forked compress/uncompress/gzip command to
+ # handle it.
+ AC_MSG_CHECKING([whether to handle compressed pixmaps])
+ case $host_os in
+@@ -77,7 +77,6 @@ else
+ XPM_PATH_PROG([XPM_PATH_COMPRESS], [compress])
+ XPM_PATH_PROG([XPM_PATH_UNCOMPRESS], [uncompress])
+ XPM_PATH_PROG([XPM_PATH_GZIP], [gzip])
+- XPM_PATH_PROG([XPM_PATH_GUNZIP], [gunzip])
+ AC_CHECK_FUNCS([closefrom close_range], [break])
+ fi
+
+diff --git a/src/RdFToI.c b/src/RdFToI.c
+index a91d337..141c485 100644
+--- a/src/RdFToI.c
++++ b/src/RdFToI.c
+@@ -251,7 +251,7 @@ OpenReadFile(
+ else if ( ext && !strcmp(ext, ".gz") )
+ {
+ mdata->type = XPMPIPE;
+- mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GUNZIP, "-qc", "r");
++ mdata->stream.file = xpmPipeThrough(fd, XPM_PATH_GZIP, "-dqc", "r");
+ }
+ else
+ #endif /* z-files */
+--
+2.15.2
+
only in patch2:
unchanged:
--- libxpm-3.5.12.orig/debian/patches/configure-add-disable-open-zfile-instead-of-requirin.patch
+++ libxpm-3.5.12/debian/patches/configure-add-disable-open-zfile-instead-of-requirin.patch
@@ -0,0 +1,71 @@
+From 4841039e5385f264d12757903894f47c64f59361 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Thu, 5 Jan 2023 15:42:36 -0800
+Subject: configure: add --disable-open-zfile instead of requiring -DNO_ZPIPE
+
+Documents the two compression options in the README, makes their
+configure options reflect the interdependency of their implementation,
+and makes the configure script report their configuration.
+
+Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+---
+ README.md | 15 +++++++++++++++
+ configure.ac | 36 +++++++++++++++++++++++-------------
+ 2 files changed, 38 insertions(+), 13 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 789a96e70831..1b648309705c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -49,25 +49,35 @@ if test "x$USE_GETTEXT" = "xyes" ; then
+ fi
+ AM_CONDITIONAL(USE_GETTEXT, test "x$USE_GETTEXT" = "xyes")
+
++# Optional feature: When a filename ending in .Z or .gz is requested,
++# open a pipe to a newly forked compress/uncompress/gzip/gunzip command to
++# handle it.
++AC_MSG_CHECKING([whether to handle compressed pixmaps])
++case $host_os in
++ *mingw*) zpipe_default="no" ;;
++ *) zpipe_default="yes" ;;
++esac
++AC_ARG_ENABLE(open-zfile,
++ AS_HELP_STRING([--enable-open-zfile],
++ [Search for files with .Z & .gz extensions automatically @<:@default=auto@:>@]),
++ [OPEN_ZFILE=$enableval], [OPEN_ZFILE=yes])
++AC_MSG_RESULT([$OPEN_ZFILE])
++if test x$OPEN_ZFILE = xno ; then
++ AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes])
++fi
++
+ # Optional feature: When ___.xpm is requested, also look for ___.xpm.Z & .gz
+ # Replaces ZFILEDEF = -DSTAT_ZFILE in old Imakefile
++AC_MSG_CHECKING([whether to search for compressed pixmaps])
+ AC_ARG_ENABLE(stat-zfile,
+- AS_HELP_STRING([--enable-stat-zfile],
+- [Search for files with .Z & .gz extensions automatically @<:@default=yes@:>@]),
+- [STAT_ZFILE=$enableval], [STAT_ZFILE=yes])
++ AS_HELP_STRING([--enable-stat-zfile],
++ [Search for files with .Z & .gz extensions automatically @<:@default=auto@:>@]),
++ [STAT_ZFILE=$enableval], [STAT_ZFILE=$OPEN_ZFILE])
++AC_MSG_RESULT([$STAT_ZFILE])
+ if test x$STAT_ZFILE = xyes ; then
+- AC_DEFINE(STAT_ZFILE, 1, [Define to 1 to automatically look for files with .Z & .gz extensions])
++ AC_DEFINE(STAT_ZFILE, 1, [Define to 1 to automatically look for files with .Z & .gz extensions])
+ fi
+
+-
+-case $host_os in
+- *mingw*)
+- AC_DEFINE(NO_ZPIPE, 1, [Define to 1 to disable decompression via pipes])
+- ;;
+- *)
+- ;;
+-esac
+-
+ AC_CONFIG_FILES([Makefile
+ doc/Makefile
+ include/Makefile
+--
+2.39.0
+
Reply to: