<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/61be35a92734c970cae6bd08e35442154daf26a3">https://github.com/macports/macports-legacy-support/commit/61be35a92734c970cae6bd08e35442154daf26a3</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 61be35a92734c970cae6bd08e35442154daf26a3
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Mon May 27 21:07:31 2024 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Add tests for stpncpy() security wrapper.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This adds three tests for the proper behavior of the stpncpy()
</span><span style='display:block; white-space:pre;color:#404040;'>    security wrapper, both with and without explictly setting
</span><span style='display:block; white-space:pre;color:#404040;'>    _FORTIFY_SOURCE.
</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;'>    Fails in expected cases without the corresponding fix, and passes in
</span><span style='display:block; white-space:pre;color:#404040;'>    all cases with the fix.
</span>---
 Makefile                       |   4 +
 test/test_stpncpy_chk.c        | 209 +++++++++++++++++++++++++++++++++++++++++
 test/test_stpncpy_chk_force1.c |   7 ++
 test/test_stpncpy_chk_forced.c |  12 +++
 4 files changed, 232 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/Makefile b/Makefile
</span><span style='display:block; white-space:pre;color:#808080;'>index a6adfea..1636915 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/Makefile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -303,6 +303,10 @@ test_faccessat_setuid_msg:
</span> $(TESTRUNS): $(TESTRUNPREFIX)%: $(TESTNAMEPREFIX)%
        $<
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# The "forced" tests include the unforced source
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(TESTNAMEPREFIX)stpncpy_chk_forced.o: $(TESTNAMEPREFIX)stpncpy_chk.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$(TESTNAMEPREFIX)stpncpy_chk_force1.o: $(TESTNAMEPREFIX)stpncpy_chk.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> install: install-headers install-lib
 
 install-headers:
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_stpncpy_chk.c b/test/test_stpncpy_chk.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..5fcd315
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_stpncpy_chk.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,209 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</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;'>+ * This provides test cases for the stpncpy() security wrapper.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * There may or may not be compile-time warnings in some cases, but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the final pass/fail should be as expected.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Informational messages regarding the relevant compile flags are also
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * included.
</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;'>+/* Allow deferring the stdio.h include */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int printf(const char *format, ...);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PRINT_VAR(x) printf("    %s = %lld\n", #x, (long long) x)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PRINT_UNDEF(x) printf("    " #x " is undefined\n")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+print_before(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf("  Before string.h include:\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #ifdef _FORTIFY_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_VAR(_FORTIFY_SOURCE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_UNDEF(_FORTIFY_SOURCE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #ifdef _USE_FORTIFY_LEVEL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_VAR(_USE_FORTIFY_LEVEL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_UNDEF(_USE_FORTIFY_LEVEL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #endif
</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;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+print_after(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf("  After  string.h include:\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #ifdef _FORTIFY_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_VAR(_FORTIFY_SOURCE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_UNDEF(_FORTIFY_SOURCE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #ifdef _USE_FORTIFY_LEVEL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_VAR(_USE_FORTIFY_LEVEL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  PRINT_UNDEF(_USE_FORTIFY_LEVEL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #endif
</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;'>+#if defined(_USE_FORTIFY_LEVEL) && _USE_FORTIFY_LEVEL > 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CHECKS_ARE_ENABLED 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define CHECKS_ARE_ENABLED 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <libgen.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/wait.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+const char *test_str = "The Quick Brown Fox";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BUF_LEN 128  /* Generously longer than test_str */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static char dest[BUF_LEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Test stpncpy() known good at compile time */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_good_stpncpy_static(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(dest, test_str, BUF_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;'>+/* Test stpncpy() known bad at compile time */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_bad_stpncpy_static(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(dest, test_str, BUF_LEN+1);
</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;'>+/* Test stpncpy() known good as auto buf */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_good_stpncpy_auto(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char buf[BUF_LEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(buf, test_str, BUF_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;'>+/* Test stpncpy() known bad as auto buf */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_bad_stpncpy_auto(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char buf[BUF_LEN];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(buf, test_str, BUF_LEN+1);
</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;'>+ * Some documentation suggests that the checks can work for cases where
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * the output buffer length isn't known at compile time.  Empirically,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * this does not seem to be the case, though perhaps there are tools which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * can make this work for testing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Meanwhile, we include a couple of tests for this, but disable them.
</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;'>+/* Test stpncpy() known good as runtime malloc() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_good_stpncpy_runtime(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *buf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  buf = malloc(BUF_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!buf) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    perror("malloc() failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    test_bad_stpncpy_static();  /* Try to provoke failure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(buf, test_str, BUF_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free(buf);
</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;'>+/* Test stpncpy() known bad as runtime malloc() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+test_bad_stpncpy_runtime(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  char *buf;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  buf = malloc(BUF_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (!buf) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    perror("malloc() failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) stpncpy(buf, test_str, BUF_LEN+1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  free(buf);
</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;'>+typedef void test_func_t(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Run test func as a subprocess, to capture abort() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+run_test_func(test_func_t *func)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  pid_t child, done;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  child = fork();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (child < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    perror("fork() failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit(100);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (child == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    (*func)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  done = wait(&status);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (done != child) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf(stderr, "Unexpected wait() pid, %d != %d\n", done, child);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit(110);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return status;
</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;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, char *argv[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int have_compile_time_checks = CHECKS_ARE_ENABLED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int have_runtime_checks = 0;  /* These don't currently work */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  (void) argc;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf("Running %s\n", basename(argv[0]));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  print_before();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  print_after();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Forking with unflushed buffers may produce duplicate output. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  fflush(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (have_compile_time_checks) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_good_stpncpy_static) == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_bad_stpncpy_static) != 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_good_stpncpy_auto) == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_bad_stpncpy_auto) != 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (have_runtime_checks) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_good_stpncpy_runtime) == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    assert(run_test_func(&test_bad_stpncpy_runtime) != 0);
</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;'>+  printf("Tests pass\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_stpncpy_chk_force1.c b/test/test_stpncpy_chk_force1.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..b09ae0f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_stpncpy_chk_force1.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Version of test_stpncpy_chk with enable forced to 1 (not the usual 2).
</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;'>+#define _FORTIFY_SOURCE 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "test_stpncpy_chk.c"
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_stpncpy_chk_forced.c b/test/test_stpncpy_chk_forced.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..ee95a05
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_stpncpy_chk_forced.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Version of test_stpncpy_chk with enable forced on.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * The security wrapper mechanism is unavailable on 10.4, available but
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * defaulted off in 10.5, and enabled and defaulted on in 10.6+.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Overriding the default here enables it on 10.5, with no effect on other
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OS versions.
</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;'>+#define _FORTIFY_SOURCE 2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "test_stpncpy_chk.c"
</span></pre><pre style='margin:0'>

</pre>