Blame SOURCES/diffutils-3.7-coverity.patch

4a2376
diff -up diffutils-3.7/lib/careadlinkat.c.me diffutils-3.7/lib/careadlinkat.c
4a2376
--- diffutils-3.7/lib/careadlinkat.c.me	2021-03-23 23:19:06.957542021 +0100
4a2376
+++ diffutils-3.7/lib/careadlinkat.c	2021-03-23 23:22:29.309145314 +0100
4a2376
@@ -1,6 +1,6 @@
4a2376
 /* Read symbolic links into a buffer without size limitation, relative to fd.
4a2376
 
4a2376
-   Copyright (C) 2001, 2003-2004, 2007, 2009-2018 Free Software Foundation,
4a2376
+   Copyright (C) 2001, 2003-2004, 2007, 2009-2021 Free Software Foundation,
4a2376
    Inc.
4a2376
 
4a2376
    This program is free software: you can redistribute it and/or modify
4a2376
@@ -38,75 +38,64 @@
4a2376
 
4a2376
 #include "allocator.h"
4a2376
 
4a2376
-/* Assuming the current directory is FD, get the symbolic link value
4a2376
-   of FILENAME as a null-terminated string and put it into a buffer.
4a2376
-   If FD is AT_FDCWD, FILENAME is interpreted relative to the current
4a2376
-   working directory, as in openat.
4a2376
-
4a2376
-   If the link is small enough to fit into BUFFER put it there.
4a2376
-   BUFFER's size is BUFFER_SIZE, and BUFFER can be null
4a2376
-   if BUFFER_SIZE is zero.
4a2376
-
4a2376
-   If the link is not small, put it into a dynamically allocated
4a2376
-   buffer managed by ALLOC.  It is the caller's responsibility to free
4a2376
-   the returned value if it is nonnull and is not BUFFER.  A null
4a2376
-   ALLOC stands for the standard allocator.
4a2376
-
4a2376
-   The PREADLINKAT function specifies how to read links.  It operates
4a2376
-   like POSIX readlinkat()
4a2376
-   <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
4a2376
-   but can assume that its first argument is the same as FD.
4a2376
+enum { STACK_BUF_SIZE = 1024 };
4a2376
 
4a2376
-   If successful, return the buffer address; otherwise return NULL and
4a2376
-   set errno.  */
4a2376
+/* Act like careadlinkat (see below), with an additional argument
4a2376
+   STACK_BUF that can be used as temporary storage.
4a2376
 
4a2376
-char *
4a2376
-careadlinkat (int fd, char const *filename,
4a2376
+   If GCC_LINT is defined, do not inline this function with GCC 10.1
4a2376
+   and later, to avoid creating a pointer to the stack that GCC
4a2376
+   -Wreturn-local-addr incorrectly complains about.  See:
4a2376
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
4a2376
+   Although the noinline attribute can hurt performance a bit, no better way
4a2376
+   to pacify GCC is known; even an explicit #pragma does not pacify GCC.
4a2376
+   When the GCC bug is fixed this workaround should be limited to the
4a2376
+   broken GCC versions.  */
4a2376
+#if __GNUC_PREREQ (10, 1)
4a2376
+# if defined GCC_LINT || defined lint
4a2376
+__attribute__ ((__noinline__))
4a2376
+# elif __OPTIMIZE__ && !__NO_INLINE__
4a2376
+#  define GCC_BOGUS_WRETURN_LOCAL_ADDR
4a2376
+# endif
4a2376
+#endif
4a2376
+static char *
4a2376
+readlink_stk (int fd, char const *filename,
4a2376
               char *buffer, size_t buffer_size,
4a2376
               struct allocator const *alloc,
4a2376
-              ssize_t (*preadlinkat) (int, char const *, char *, size_t))
4a2376
+              ssize_t (*preadlinkat) (int, char const *, char *, size_t),
4a2376
+              char stack_buf[STACK_BUF_SIZE])
4a2376
 {
4a2376
   char *buf;
4a2376
   size_t buf_size;
4a2376
   size_t buf_size_max =
4a2376
     SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
4a2376
-  char stack_buf[1024];
4a2376
 
4a2376
   if (! alloc)
4a2376
     alloc = &stdlib_allocator;
4a2376
 
4a2376
-  if (! buffer_size)
4a2376
+  if (!buffer)
4a2376
     {
4a2376
-      /* Allocate the initial buffer on the stack.  This way, in the
4a2376
-         common case of a symlink of small size, we get away with a
4a2376
-         single small malloc() instead of a big malloc() followed by a
4a2376
-         shrinking realloc().  */
4a2376
       buffer = stack_buf;
4a2376
-      buffer_size = sizeof stack_buf;
4a2376
+      buffer_size = STACK_BUF_SIZE;
4a2376
     }
4a2376
 
4a2376
   buf = buffer;
4a2376
   buf_size = buffer_size;
4a2376
 
4a2376
-  do
4a2376
+  while (buf)
4a2376
     {
4a2376
       /* Attempt to read the link into the current buffer.  */
4a2376
       ssize_t link_length = preadlinkat (fd, filename, buf, buf_size);
4a2376
       size_t link_size;
4a2376
       if (link_length < 0)
4a2376
         {
4a2376
-          /* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink returns -1
4a2376
-             with errno == ERANGE if the buffer is too small.  */
4a2376
-          int readlinkat_errno = errno;
4a2376
-          if (readlinkat_errno != ERANGE)
4a2376
+          if (buf != buffer)
4a2376
             {
4a2376
-              if (buf != buffer)
4a2376
-                {
4a2376
-                  alloc->free (buf);
4a2376
-                  errno = readlinkat_errno;
4a2376
-                }
4a2376
-              return NULL;
4a2376
+              int readlinkat_errno = errno;
4a2376
+              alloc->free (buf);
4a2376
+              errno = readlinkat_errno;
4a2376
             }
4a2376
+          return NULL;
4a2376
         }
4a2376
 
4a2376
       link_size = link_length;
4a2376
@@ -117,19 +106,19 @@ careadlinkat (int fd, char const *filena
4a2376
 
4a2376
           if (buf == stack_buf)
4a2376
             {
4a2376
-              char *b = (char *) alloc->allocate (link_size);
4a2376
+              char *b = alloc->allocate (link_size);
4a2376
               buf_size = link_size;
4a2376
               if (! b)
4a2376
                 break;
4a2376
-              memcpy (b, buf, link_size);
4a2376
-              buf = b;
4a2376
+              return memcpy (b, buf, link_size);
4a2376
             }
4a2376
-          else if (link_size < buf_size && buf != buffer && alloc->reallocate)
4a2376
+
4a2376
+          if (link_size < buf_size && buf != buffer && alloc->reallocate)
4a2376
             {
4a2376
               /* Shrink BUF before returning it.  */
4a2376
-              char *b = (char *) alloc->reallocate (buf, link_size);
4a2376
+              char *b = alloc->reallocate (buf, link_size);
4a2376
               if (b)
4a2376
-                buf = b;
4a2376
+                return b;
4a2376
             }
4a2376
 
4a2376
           return buf;
4a2376
@@ -138,8 +127,8 @@ careadlinkat (int fd, char const *filena
4a2376
       if (buf != buffer)
4a2376
         alloc->free (buf);
4a2376
 
4a2376
-      if (buf_size <= buf_size_max / 2)
4a2376
-        buf_size *= 2;
4a2376
+      if (buf_size < buf_size_max / 2)
4a2376
+        buf_size = 2 * buf_size + 1;
4a2376
       else if (buf_size < buf_size_max)
4a2376
         buf_size = buf_size_max;
4a2376
       else if (buf_size_max < SIZE_MAX)
4a2376
@@ -149,12 +138,53 @@ careadlinkat (int fd, char const *filena
4a2376
         }
4a2376
       else
4a2376
         break;
4a2376
-      buf = (char *) alloc->allocate (buf_size);
4a2376
+      buf = alloc->allocate (buf_size);
4a2376
     }
4a2376
-  while (buf);
4a2376
 
4a2376
   if (alloc->die)
4a2376
     alloc->die (buf_size);
4a2376
   errno = ENOMEM;
4a2376
   return NULL;
4a2376
 }
4a2376
+
4a2376
+
4a2376
+/* Assuming the current directory is FD, get the symbolic link value
4a2376
+   of FILENAME as a null-terminated string and put it into a buffer.
4a2376
+   If FD is AT_FDCWD, FILENAME is interpreted relative to the current
4a2376
+   working directory, as in openat.
4a2376
+
4a2376
+   If the link is small enough to fit into BUFFER put it there.
4a2376
+   BUFFER's size is BUFFER_SIZE, and BUFFER can be null
4a2376
+   if BUFFER_SIZE is zero.
4a2376
+
4a2376
+   If the link is not small, put it into a dynamically allocated
4a2376
+   buffer managed by ALLOC.  It is the caller's responsibility to free
4a2376
+   the returned value if it is nonnull and is not BUFFER.  A null
4a2376
+   ALLOC stands for the standard allocator.
4a2376
+
4a2376
+   The PREADLINKAT function specifies how to read links.  It operates
4a2376
+   like POSIX readlinkat()
4a2376
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>
4a2376
+   but can assume that its first argument is the same as FD.
4a2376
+
4a2376
+   If successful, return the buffer address; otherwise return NULL and
4a2376
+   set errno.  */
4a2376
+
4a2376
+char *
4a2376
+careadlinkat (int fd, char const *filename,
4a2376
+              char *buffer, size_t buffer_size,
4a2376
+              struct allocator const *alloc,
4a2376
+              ssize_t (*preadlinkat) (int, char const *, char *, size_t))
4a2376
+{
4a2376
+  /* Allocate the initial buffer on the stack.  This way, in the
4a2376
+     common case of a symlink of small size, we get away with a
4a2376
+     single small malloc instead of a big malloc followed by a
4a2376
+     shrinking realloc.  */
4a2376
+  #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
4a2376
+   #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
4a2376
+   #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
4a2376
+  #endif
4a2376
+  char stack_buf[STACK_BUF_SIZE];
4a2376
+  return readlink_stk (fd, filename, buffer, buffer_size, alloc,
4a2376
+                       preadlinkat, stack_buf);
4a2376
+}
4a2376
diff -up diffutils-3.7/src/diff.c.me diffutils-3.7/src/diff.c
4a2376
diff -up diffutils-3.7/src/diff.h.me diffutils-3.7/src/diff.h
4a2376
--- diffutils-3.7/src/diff.h.me	2021-03-23 22:47:04.509390138 +0100
4a2376
+++ diffutils-3.7/src/diff.h	2021-03-23 22:58:35.022552755 +0100
4a2376
@@ -392,7 +392,7 @@ extern void print_sdiff_script (struct c
4a2376
 extern char const change_letter[4];
4a2376
 extern char const pr_program[];
4a2376
 extern char *concat (char const *, char const *, char const *);
4a2376
-extern bool (*lines_differ) (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
4a2376
+extern bool (*lines_differ) (char const *, size_t, char const *, size_t);
4a2376
 extern bool lines_differ_singlebyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
4a2376
 #ifdef HANDLE_MULTIBYTE
4a2376
 extern bool lines_differ_multibyte (char const *, size_t, char const *, size_t) _GL_ATTRIBUTE_PURE;
4a2376
diff -up diffutils-3.7/src/util.c.me diffutils-3.7/src/util.c
4a2376
--- diffutils-3.7/src/util.c.me	2021-03-23 23:01:58.105168496 +0100
4a2376
+++ diffutils-3.7/src/util.c	2021-03-23 23:18:18.833918967 +0100
4a2376
@@ -1144,6 +1144,7 @@ lines_differ_singlebyte (char const *s1,
4a2376
 }
4a2376
 
4a2376
 #ifdef HANDLE_MULTIBYTE
4a2376
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
4a2376
 # define MBC2WC(T, END, MBLENGTH, WC, STATE, CONVFAIL)	\
4a2376
 do							\
4a2376
   {							\
4a2376
diff -up diffutils-3.7/lib/regcomp.c.me diffutils-3.7/lib/regcomp.c
4a2376
--- diffutils-3.7/lib/regcomp.c.me	2021-03-24 09:01:20.582271604 +0100
4a2376
+++ diffutils-3.7/lib/regcomp.c	2021-03-24 09:03:54.125287605 +0100
4a2376
@@ -3674,7 +3674,6 @@ build_charclass_op (re_dfa_t *dfa, RE_TR
4a2376
   Idx alloc = 0;
4a2376
 #endif /* not RE_ENABLE_I18N */
4a2376
   reg_errcode_t ret;
4a2376
-  re_token_t br_token;
4a2376
   bin_tree_t *tree;
4a2376
 
4a2376
   sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
4a2376
@@ -3725,11 +3724,7 @@ build_charclass_op (re_dfa_t *dfa, RE_TR
4a2376
 #endif
4a2376
 
4a2376
   /* Build a tree for simple bracket.  */
4a2376
-#if defined GCC_LINT || defined lint
4a2376
-  memset (&br_token, 0, sizeof br_token);
4a2376
-#endif
4a2376
-  br_token.type = SIMPLE_BRACKET;
4a2376
-  br_token.opr.sbcset = sbcset;
4a2376
+  re_token_t br_token = { .type = SIMPLE_BRACKET, .opr.sbcset = sbcset };
4a2376
   tree = create_token_tree (dfa, NULL, NULL, &br_token);
4a2376
   if (__glibc_unlikely (tree == NULL))
4a2376
     goto build_word_op_espace;
4a2376
@@ -3820,11 +3815,7 @@ static bin_tree_t *
4a2376
 create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
4a2376
 	     re_token_type_t type)
4a2376
 {
4a2376
-  re_token_t t;
4a2376
-#if defined GCC_LINT || defined lint
4a2376
-  memset (&t, 0, sizeof t);
4a2376
-#endif
4a2376
-  t.type = type;
4a2376
+  re_token_t t = { .type = type };
4a2376
   return create_token_tree (dfa, left, right, &t);
4a2376
 }
4a2376
 
4a2376
diff -up diffutils-3.7/lib/regexec.c.me diffutils-3.7/lib/regexec.c
4a2376
--- diffutils-3.7/lib/regexec.c.me	2021-03-24 08:50:16.101143023 +0100
4a2376
+++ diffutils-3.7/lib/regexec.c	2021-03-24 08:55:03.347246385 +0100
4a2376
@@ -828,7 +828,9 @@ re_search_internal (const regex_t *preg,
4a2376
 		    break;
4a2376
 		  if (__glibc_unlikely (err != REG_NOMATCH))
4a2376
 		    goto free_return;
4a2376
+#ifdef DEBUG
4a2376
 		  match_last = -1;
4a2376
+#endif
4a2376
 		}
4a2376
 	      else
4a2376
 		break; /* We found a match.  */
4a2376
@@ -3693,6 +3695,7 @@ group_nodes_into_DFAstates (const re_dfa
4a2376
 	  bitset_empty (accepts);
4a2376
 	}
4a2376
     }
4a2376
+  assume (ndests <= SBC_MAX);
4a2376
   return ndests;
4a2376
  error_return:
4a2376
   for (j = 0; j < ndests; ++j)
4a2376
diff -up diffutils-3.7/lib/regex_internal.h.me diffutils-3.7/lib/regex_internal.h
4a2376
--- diffutils-3.7/lib/regex_internal.h.me	2021-03-24 08:54:03.464477733 +0100
4a2376
+++ diffutils-3.7/lib/regex_internal.h	2021-03-24 08:54:22.824728618 +0100
4a2376
@@ -34,6 +34,7 @@
4a2376
 #include <stdint.h>
4a2376
 
4a2376
 #include <intprops.h>
4a2376
+#include <verify.h>
4a2376
 
4a2376
 #ifdef _LIBC
4a2376
 # include <libc-lock.h>
4a2376
diff -up diffutils-3.7/src/ifdef.c.me diffutils-3.7/src/ifdef.c
4a2376
--- diffutils-3.7/src/ifdef.c.me	2021-03-24 18:10:43.265671781 +0100
4a2376
+++ diffutils-3.7/src/ifdef.c	2021-03-24 18:08:39.843320920 +0100
4a2376
@@ -362,7 +362,7 @@ do_printf_spec (FILE *out, char const *s
4a2376
 	    printint print_value = value;
4a2376
 	    size_t spec_prefix_len = f - spec - 2;
4a2376
 	    size_t pI_len = sizeof pI - 1;
4a2376
-#if 0
4a2376
+#if HAVE_C_VARARRAYS
4a2376
 	    char format[spec_prefix_len + pI_len + 2];
4a2376
 #else
4a2376
 	    char *format = xmalloc (spec_prefix_len + pI_len + 2);