[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1031982: bullseye-pu: package gcc-10/10.2.1-6+deb11u1



Package: release.debian.org
Severity: normal
Tags: bullseye
User: release.debian.org@packages.debian.org
Usertags: pu
X-Debbugs-Cc: gcc-10@packages.debian.org, jmm@debian.org, doko@ubuntu.com, dianne@skoll.ca, hans@knorrie.org, 1027456@bugs.debian.org, carnil@debian.org
Control: affects -1 + src:gcc-10

Dear stable release managers, hi Matthias,

When compiling 6.1.y kernel with gcc-10 (relevant for backports).
It was back reported at
https://lore.kernel.org/stable/187e8f10-2b73-3a18-d9ad-48b2d84bd6b9@pm.kalamlacki.eu/
and in #1027456. It can be shown as well with a reduced testcase:

----cut---------cut---------cut---------cut---------cut---------cut-----
unsigned int
strlen(char *s) {
  for (; *s;)
    ;
}

struct i2c_adapter {
  char name[48];
};

struct {
  int instance;
  struct i2c_adapter i2c_adap[];
} * init_cx18_i2c_cx;

const struct i2c_adapter cx18_i2c_adap_template = {""};
int init_cx18_i2c___trans_tmp_1;

void
init_cx18_i2c() {
  int i = 0;
  for (;; i++) {
    init_cx18_i2c_cx->i2c_adap[i] = cx18_i2c_adap_template;
    init_cx18_i2c___trans_tmp_1 = strlen(init_cx18_i2c_cx->i2c_adap[i].name);
  }
}
----cut---------cut---------cut---------cut---------cut---------cut-----

and in gcc upstream at
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99824 .

The debdiff attached cherry-picks the upstream commit and was verified
for both the testcase above and through Hans van Kranenburg as well
for the kernel, in https://bugs.debian.org/1027456#61

So in order to make for bullseye-backports the 6.1.y kernel possible
we need something to move forward.

Matthias, comments?

Regards,
Salvatore
diff -Nru gcc-10-10.2.1/debian/changelog gcc-10-10.2.1/debian/changelog
--- gcc-10-10.2.1/debian/changelog	2021-01-10 12:35:39.000000000 +0100
+++ gcc-10-10.2.1/debian/changelog	2023-02-23 14:29:15.000000000 +0100
@@ -1,3 +1,11 @@
+gcc-10 (10.2.1-6+deb11u1) bullseye; urgency=medium
+
+  * Non-maintainer upload.
+  * tree-optimization/99824 - avoid excessive integer type precision in VN
+    (Closes: #1027456)
+
+ -- Salvatore Bonaccorso <carnil@debian.org>  Thu, 23 Feb 2023 14:29:15 +0100
+
 gcc-10 (10.2.1-6) unstable; urgency=medium
 
   * Update to git 20210110 from the gcc-10 branch.
diff -Nru gcc-10-10.2.1/debian/patches/tree-optimization-99824-avoid-excessive-integer-type.diff gcc-10-10.2.1/debian/patches/tree-optimization-99824-avoid-excessive-integer-type.diff
--- gcc-10-10.2.1/debian/patches/tree-optimization-99824-avoid-excessive-integer-type.diff	1970-01-01 01:00:00.000000000 +0100
+++ gcc-10-10.2.1/debian/patches/tree-optimization-99824-avoid-excessive-integer-type.diff	2023-02-23 14:29:15.000000000 +0100
@@ -0,0 +1,140 @@
+From: Richard Biener <rguenther@suse.de>
+Date: Tue, 30 Mar 2021 11:22:52 +0200
+Subject: tree-optimization/99824 - avoid excessive integer type precision in
+ VN
+Origin: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=ee15832c53d52656e562c29110f2be1cfb66c450
+Bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99824
+Bug-Debian: https://bugs.debian.org/1027456
+
+VN sometimes builds new integer types to handle accesss where precision
+of the access type does not match the access size.  The way
+ao_ref_init_from_vn_reference is computing the access size ignores
+the access type in case the ref operands have an outermost
+COMPONENT_REF which, in case it is an array for example, can be
+way larger than the access size.  This can cause us to try
+building an integer type with precision larger than WIDE_INT_MAX_PRECISION
+eventually leading to memory corruption.
+
+The following adjusts ao_ref_init_from_vn_reference to only lower
+access sizes via the outermost COMPONENT_REF but otherwise honor
+the access size as specified by the access type.
+
+It also places an assert in integer type building that we remain
+in the limits of WIDE_INT_MAX_PRECISION.  I chose the shared code
+where we set TYPE_MIN/MAX_VALUE because that will immediately
+cross the wide_ints capacity otherwise.
+
+2021-03-30  Richard Biener  <rguenther@suse.de>
+
+	PR tree-optimization/99824
+	* stor-layout.c (set_min_and_max_values_for_integral_type):
+	Assert the precision is within the bounds of
+	WIDE_INT_MAX_PRECISION.
+	* tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Use
+	the outermost component ref only to lower the access size
+	and initialize that from the access type.
+
+	* gcc.dg/torture/pr99824.c: New testcase.
+---
+ gcc/stor-layout.c                      |  2 ++
+ gcc/testsuite/gcc.dg/torture/pr99824.c | 33 ++++++++++++++++++++++++++
+ gcc/tree-ssa-sccvn.c                   | 24 +++++++++++--------
+ 3 files changed, 49 insertions(+), 10 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/torture/pr99824.c
+
+diff --git a/src/gcc/stor-layout.c b/src/gcc/stor-layout.c
+index bde6fa22b58a..57c8a2516d95 100644
+--- a/src/gcc/stor-layout.c
++++ b/src/gcc/stor-layout.c
+@@ -2816,6 +2816,8 @@ set_min_and_max_values_for_integral_type (tree type,
+   if (precision < 1)
+     return;
+ 
++  gcc_assert (precision <= WIDE_INT_MAX_PRECISION);
++
+   TYPE_MIN_VALUE (type)
+     = wide_int_to_tree (type, wi::min_value (precision, sgn));
+   TYPE_MAX_VALUE (type)
+diff --git a/src/gcc/testsuite/gcc.dg/torture/pr99824.c b/src/gcc/testsuite/gcc.dg/torture/pr99824.c
+new file mode 100644
+index 000000000000..9022d4a4b8e7
+--- /dev/null
++++ b/src/gcc/testsuite/gcc.dg/torture/pr99824.c
+@@ -0,0 +1,33 @@
++/* { dg-do compile } */
++
++unsigned int
++strlenx(char *s)
++{
++  char *orig_s = s;
++  for (; *s; ++s)
++    ;
++  return s - orig_s;
++}
++
++struct i2c_adapter {
++    char name[48];
++};
++
++struct {
++    int instance;
++    struct i2c_adapter i2c_adap[];
++} * init_cx18_i2c_cx;
++
++const struct i2c_adapter cx18_i2c_adap_template = {""};
++int init_cx18_i2c___trans_tmp_1;
++
++void
++init_cx18_i2c()
++{
++  int i = 0;
++  for (;; i++) {
++      init_cx18_i2c_cx->i2c_adap[i] = cx18_i2c_adap_template;
++      init_cx18_i2c___trans_tmp_1
++	= strlenx(init_cx18_i2c_cx->i2c_adap[i].name);
++  }
++}
+diff --git a/src/gcc/tree-ssa-sccvn.c b/src/gcc/tree-ssa-sccvn.c
+index 4b280f21006e..926b4a976aec 100644
+--- a/src/gcc/tree-ssa-sccvn.c
++++ b/src/gcc/tree-ssa-sccvn.c
+@@ -996,22 +996,26 @@ ao_ref_init_from_vn_reference (ao_ref *ref,
+   poly_offset_int size = -1;
+   tree size_tree = NULL_TREE;
+ 
+-  /* First get the final access size from just the outermost expression.  */
++  machine_mode mode = TYPE_MODE (type);
++  if (mode == BLKmode)
++    size_tree = TYPE_SIZE (type);
++  else
++    size = GET_MODE_BITSIZE (mode);
++  if (size_tree != NULL_TREE
++      && poly_int_tree_p (size_tree))
++    size = wi::to_poly_offset (size_tree);
++
++  /* Lower the final access size from the outermost expression.  */
+   op = &ops[0];
++  size_tree = NULL_TREE;
+   if (op->opcode == COMPONENT_REF)
+     size_tree = DECL_SIZE (op->op0);
+   else if (op->opcode == BIT_FIELD_REF)
+     size_tree = op->op0;
+-  else
+-    {
+-      machine_mode mode = TYPE_MODE (type);
+-      if (mode == BLKmode)
+-	size_tree = TYPE_SIZE (type);
+-      else
+-	size = GET_MODE_BITSIZE (mode);
+-    }
+   if (size_tree != NULL_TREE
+-      && poly_int_tree_p (size_tree))
++      && poly_int_tree_p (size_tree)
++      && (!known_size_p (size)
++	  || known_lt (wi::to_poly_offset (size_tree), size)))
+     size = wi::to_poly_offset (size_tree);
+ 
+   /* Initially, maxsize is the same as the accessed element size.
+-- 
+2.39.2
+
diff -Nru gcc-10-10.2.1/debian/rules.patch gcc-10-10.2.1/debian/rules.patch
--- gcc-10-10.2.1/debian/rules.patch	2021-01-10 12:35:39.000000000 +0100
+++ gcc-10-10.2.1/debian/rules.patch	2023-02-23 14:28:37.000000000 +0100
@@ -83,6 +83,7 @@
 	pr97250-3 \
 	pr97250-4 \
 	pr97714 \
+	tree-optimization-99824-avoid-excessive-integer-type \
 
 ifneq (,$(filter $(distrelease),wheezy jessie stretch buster lucid precise trusty xenial bionic cosmic disco eoan))
   debian_patches += pr85678-revert

Reply to: