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

Reply via email to