https://gcc.gnu.org/g:2b5c6d734044c76c4f9896b8112ea6c5b5000e39
commit r14-12279-g2b5c6d734044c76c4f9896b8112ea6c5b5000e39 Author: Iain Buclaw <[email protected]> Date: Thu Jan 29 10:11:43 2026 +0100 d: Fix buffer overflow detected with -defaultlib= and -debuglib= [PR123349] 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. (cherry picked from commit a492b8c17118592061cc3834e7a169ca724440cb) Diff: --- 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(-) diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc index cf0d418e8fed..a1e998c3143f 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 000000000000..dd06c2af37dc --- /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 000000000000..5168be071575 --- /dev/null +++ b/gcc/testsuite/gdc.dg/driver_defaultlib.d @@ -0,0 +1,2 @@ +// { dg-do compile } +// { dg-additional-options "-defaultlib=a -defaultlib=b" }
