This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Check the STRING_CSTs in varasm.c
- From: Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Richard Biener <rguenther at suse dot de>
- Date: Wed, 1 Aug 2018 11:35:35 +0000
- Subject: [PATCH] Check the STRING_CSTs in varasm.c
Hi,
this completes the previous patches, and adds a check in varasm.c
that ensures that all string constants are NUL terminated,
And that varasm does not strip anything but _exactly_ one NUL
character.
Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
Is it OK for trunk?
Thanks
Bernd.
2018-08-01 Bernd Edlinger <bernd.edlinger@hotmail.de>
* varasm.c (check_string_literal): New checking function.
(output_constant): Use it.
diff -pur gcc/varasm.c gcc/varasm.c
--- gcc/varasm.c 2018-07-17 11:19:27.000000000 +0200
+++ gcc/varasm.c 2018-07-31 10:16:12.058827505 +0200
@@ -4774,6 +4774,29 @@ initializer_constant_valid_for_bitfield_
return false;
}
+/* Check if a STRING_CST fits into the field.
+ Tolerate only the case when the NUL termination
+ does not fit into the field. */
+
+bool
+check_string_literal (tree string, unsigned HOST_WIDE_INT size)
+{
+ tree eltype = TREE_TYPE (TREE_TYPE (string));
+ unsigned HOST_WIDE_INT elts = tree_to_uhwi (TYPE_SIZE_UNIT (eltype));
+ const char *p = TREE_STRING_POINTER (string);
+ int len = TREE_STRING_LENGTH (string);
+
+ if (elts != 1 && elts != 2 && elts != 4)
+ return false;
+ if (len <= 0 || len % elts != 0)
+ return false;
+ if ((unsigned)len != size && (unsigned)len != size + elts)
+ return false;
+ if (memcmp (p + len - elts, "\0\0\0\0", elts) != 0)
+ return false;
+ return true;
+}
+
/* output_constructor outer state of relevance in recursive calls, typically
for nested aggregate bitfields. */
@@ -4942,6 +4965,7 @@ output_constant (tree exp, unsigned HOST
case STRING_CST:
thissize
= MIN ((unsigned HOST_WIDE_INT)TREE_STRING_LENGTH (exp), size);
+ gcc_checking_assert (check_string_literal (exp, thissize));
assemble_string (TREE_STRING_POINTER (exp), thissize);
break;
case VECTOR_CST: