<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/9cc5d9aac2c2a88dfaa906474c3407abbb821ac5">https://github.com/macports/macports-legacy-support/commit/9cc5d9aac2c2a88dfaa906474c3407abbb821ac5</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 9cc5d9aac2c2a88dfaa906474c3407abbb821ac5
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Sun May 26 16:41:15 2024 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Add optional security wrapper for stpncpy().
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This adds support for the optional stpncpy() security wrapper, based
</span><span style='display:block; white-space:pre;color:#404040;'>    on the _FORTIFY_SOURCE setting.  By default, it only impacts 10.6
</span><span style='display:block; white-space:pre;color:#404040;'>    builds, though it can be explicitly enabled on 10.5, albeit less
</span><span style='display:block; white-space:pre;color:#404040;'>    efficiently due to the lack of the compiler builtin.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    The stpncpy() function is the only one with an optional security
</span><span style='display:block; white-space:pre;color:#404040;'>    wrapper which is also optionally provided by legacy-support.  Hence,
</span><span style='display:block; white-space:pre;color:#404040;'>    this is the only addition needed to close the more general ticket.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/69878
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also fixes a minor comment formatting issue.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'>    Tested on 10.4-10.5 ppc, 10.4-10.6 i386, 10.5-10.6 ppc (i386 Rosetta),
</span><span style='display:block; white-space:pre;color:#404040;'>    10.5-12.x x86_64, 11.x-14.x arm64.
</span><span style='display:block; white-space:pre;color:#404040;'>    Passes all tests, including newly added tests for this feature.
</span>---
 include/string.h  | 54 +++++++++++++++++++++++++++++++++++++++++---
 src/stpncpy.c     | 10 +++++++--
 src/stpncpy_chk.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 126 insertions(+), 5 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/string.h b/include/string.h
</span><span style='display:block; white-space:pre;color:#808080;'>index cee7177..163230b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/string.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/string.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,12 +25,16 @@
</span> #include_next <string.h>
 
 /* stpncpy */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if __MP_LEGACY_SUPPORT_STPNCPY__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If we're building with a 10.7+ SDK, stpncpy may have already been defined as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * a macro. In that case, leave it as is.  This not only leaves it as provided
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * by the SDK, but also informs the decision below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MP_LEGACY_SUPPORT_STPNCPY__ && !defined(stpncpy)
</span> __MP__BEGIN_DECLS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#undef stpncpy  /* In case built with later SDK */
</span> extern char *stpncpy(char *dst, const char *src, size_t n);
 __MP__END_DECLS
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MP_LEGACY_SUPPORT_STPNCPY__ && !defined(stpncpy) */
</span> 
 /* strnlen */
 #if __MP_LEGACY_SUPPORT_STRNLEN__
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -54,4 +58,48 @@ memmem(const void *l, size_t l_len, const void *s, size_t s_len);
</span> __MP__END_DECLS
 #endif
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Security wrapper support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Rather than pushing this off into an added secure/_string.h, we just do it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * here directly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * If security wrappers are wanted, the SDK string.h has already included
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * secure/_common.h, and _USE_FORTIFY_LEVEL has been appropriately defined.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Otherwise, _USE_FORTIFY_LEVEL is undefined.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(_USE_FORTIFY_LEVEL) && _USE_FORTIFY_LEVEL > 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* stpncpy */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Note the defense against building with a 10.7+ SDK, as above. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MP_LEGACY_SUPPORT_STPNCPY__ && !defined(stpncpy)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * GCC 4.2 for 10.5 lacks __builtin___stpncpy_chk, even though GCC 4.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * for 10.6 has it.  In the absence of a reasonable way to check for compiler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * support directly, we rely on the OS version for the decision.  Note that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the security wrapper mechanism isn't enabled by default on 10.5, anyway,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * but this allows it to work (inefficiently) if it's enabled explicitly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern char *__stpncpy_chk(char *dest, const char *src, size_t len,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           size_t dstlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __builtin___stpncpy_chk __stpncpy_chk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* OS <10.6 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define stpncpy(dest, src, len)                                    \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ((__darwin_obsz0 (dest) != (size_t) -1)                          \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ? __builtin___stpncpy_chk (dest, src, len, __darwin_obsz (dest))        \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   : __inline_stpncpy_chk (dest, src, len))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static __inline char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__inline_stpncpy_chk (char *__restrict __dest, const char *__restrict __src,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 size_t __len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return __builtin___stpncpy_chk (__dest, __src, __len, __darwin_obsz(__dest));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MP_LEGACY_SUPPORT_STPNCPY__ && !defined(stpncpy) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* _USE_FORTIFY_LEVEL > 0 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #endif /* _MACPORTS_STRING_H_ */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/stpncpy.c b/src/stpncpy.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 4f6375c..469002a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/stpncpy.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/stpncpy.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -21,20 +21,26 @@
</span>  * @APPLE_LICENSE_HEADER_END@
  */
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span>  * NOTICE: This file was modified in April 2024 to allow
  * for use as a supporting file for MacPorts legacy support library. This notice
  * is included in support of clause 2.2 (b) of the Apple Public License,
  * Version 2.0.
  *
  * The code is almost verbatim from Apple except for the removal of the
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * 'restrict' qualifiers for compatibility with pre-C99 compilers.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * 'restrict' qualifiers for compatibility with pre-C99 compilers, and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the _FORTIFY_SOURCE definition here in lieu of including it as a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * compiler flag (as the Apple build procedure does).
</span>  */
 
 /* MP support header */
 #include "MacportsLegacySupport.h"
 #if __MP_LEGACY_SUPPORT_STPNCPY__
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Ensure that we don't use the wrapper macro when defining the function */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef _FORTIFY_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _FORTIFY_SOURCE 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #include <string.h>
 
 char *
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/stpncpy_chk.c b/src/stpncpy_chk.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..893f7aa
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/stpncpy_chk.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,67 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2010 Apple Inc. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @APPLE_LICENSE_HEADER_START@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This file contains Original Code and/or Modifications of Original Code
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * as defined in and that are subject to the Apple Public Source License
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Version 2.0 (the 'License'). You may not use this file except in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * compliance with the License. Please obtain a copy of the License at
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * http://www.opensource.apple.com/apsl/ and read it before using this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * file.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The Original Code and all software distributed under the License are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Please see the License for the specific language governing rights and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * limitations under the License.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @APPLE_LICENSE_HEADER_END@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * NOTICE: This file was modified in May 2024 to allow for use as a supporting
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * file for MacPorts legacy support library. This notice is included in support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * of clause 2.2 (b) of the Apple Public License, Version 2.0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The code is almost verbatim from Apple except for:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The correction of the return type.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The removal of the 'restrict' qualifiers for compatibility with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * pre-C99 compilers.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The addition of the missing 'const' qualifier.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The _FORTIFY_SOURCE definition here in lieu of providing it as a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * compiler command-line flag (as the Apple build procedure does).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MP support header */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacySupport.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Note that the support for this mechanism is absent prior to 10.5 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MP_LEGACY_SUPPORT_STPNCPY__ && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Ensure that we don't create an infinitely recursive check function */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef _FORTIFY_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define _FORTIFY_SOURCE 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern void __chk_fail (void) __attribute__((__noreturn__));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+__stpncpy_chk (char *dest, const char *src,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          size_t len, size_t dstlen)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (__builtin_expect (dstlen < len, 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    __chk_fail ();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return stpncpy (dest, src, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* __MP_LEGACY_SUPPORT_STPNCPY__  && >= 10.5*/
</span></pre><pre style='margin:0'>

</pre>