Hi,
This patch fixes PR123349.
When the gdc driver is built with hardening flags enabled, buffer
overflow detection got tripped when copying the argument for
-defaultlib= and -debuglib=. This is now using xstrdup instead.
Regstrapped on x86_64-linux-gnu, committed to mainline, and backported
to releases/gcc-13, gcc-14, and gcc-15.
Regards,
Iain.
---
PR d/123349
gcc/d/ChangeLog:
* d-spec.cc (lang_specific_driver): Use xstrdup to copy -defaultlib
and -debuglib argument, and unconditionally free the old value.
gcc/testsuite/ChangeLog:
* gdc.dg/driver_debuglib.d: New test.
* gdc.dg/driver_defaultlib.d: New test.
---
gcc/d/d-spec.cc | 12 ++++--------
gcc/testsuite/gdc.dg/driver_debuglib.d | 2 ++
gcc/testsuite/gdc.dg/driver_defaultlib.d | 2 ++
3 files changed, 8 insertions(+), 8 deletions(-)
create mode 100644 gcc/testsuite/gdc.dg/driver_debuglib.d
create mode 100644 gcc/testsuite/gdc.dg/driver_defaultlib.d
diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc
index 442bc1d8820..c4600b2e9f4 100644
--- a/gcc/d/d-spec.cc
+++ b/gcc/d/d-spec.cc
@@ -162,24 +162,20 @@ lang_specific_driver (cl_decoded_option
**in_decoded_options,
break;
case OPT_defaultlib_:
- if (defaultlib != NULL)
- free (CONST_CAST (char *, defaultlib));
+ free (CONST_CAST (char *, defaultlib));
if (arg != NULL)
{
args[i] |= SKIPOPT;
- defaultlib = XNEWVEC (char, strlen (arg));
- strcpy (CONST_CAST (char *, defaultlib), arg);
+ defaultlib = xstrdup (arg);
}
break;
case OPT_debuglib_:
- if (debuglib != NULL)
- free (CONST_CAST (char *, debuglib));
+ free (CONST_CAST (char *, debuglib));
if (arg != NULL)
{
args[i] |= SKIPOPT;
- debuglib = XNEWVEC (char, strlen (arg));
- strcpy (CONST_CAST (char *, debuglib), arg);
+ debuglib = xstrdup (arg);
}
break;
diff --git a/gcc/testsuite/gdc.dg/driver_debuglib.d
b/gcc/testsuite/gdc.dg/driver_debuglib.d
new file mode 100644
index 00000000000..dd06c2af37d
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/driver_debuglib.d
@@ -0,0 +1,2 @@
+// { dg-do compile }
+// { dg-additional-options "-debuglib=a -debuglib=b" }
diff --git a/gcc/testsuite/gdc.dg/driver_defaultlib.d
b/gcc/testsuite/gdc.dg/driver_defaultlib.d
new file mode 100644
index 00000000000..5168be07157
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/driver_defaultlib.d
@@ -0,0 +1,2 @@
+// { dg-do compile }
+// { dg-additional-options "-defaultlib=a -defaultlib=b" }
--
2.43.0