Blame SOURCES/diffutils-3.7-coverity.patch

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