<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/42c54ff9d5e8733ec76f53b52ce2a7cbd6870763">https://github.com/macports/macports-legacy-support/commit/42c54ff9d5e8733ec76f53b52ce2a7cbd6870763</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 42c54ff9d5e8733ec76f53b52ce2a7cbd6870763
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Thu Nov 7 17:27:22 2024 -0800
<span style='display:block; white-space:pre;color:#404040;'> test_realpath: Add nonexistent path case.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Although more thorough testing of various path cases would be useful,
</span><span style='display:block; white-space:pre;color:#404040;'> this one, which just tests a simple nonexistent relative path, is
</span><span style='display:block; white-space:pre;color:#404040;'> sufficient to demonstrate a bug in the 10.6 non-POSIX realpath(),
</span><span style='display:block; white-space:pre;color:#404040;'> which returns "success" via an unsafe pointer to an internal buffer.
</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;'> Fails in known bad case without the fix; passes in all cases with the
</span><span style='display:block; white-space:pre;color:#404040;'> fix.
</span>---
test/test_realpath.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_realpath.c b/test/test_realpath.c
</span><span style='display:block; white-space:pre;color:#808080;'>index ec890dc..cf14745 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -37,6 +37,7 @@ typedef struct { strfunc_t realpath; } rpf_t;
</span>
#include <assert.h>
#include <libgen.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stddef.h>
</span> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,6 +45,17 @@ typedef struct { strfunc_t realpath; } rpf_t;
</span>
#include <sys/param.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Beginning in the 15.x SDK, including malloc.h doesn't work when
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * _POSIX_C_SOURCE is defined, which we need for the "nonext" version.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * So we avoid the official include and declare malloc_size() directly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * #include <malloc/malloc.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern size_t malloc_size(const void *ptr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define NONEX_PATH "4981a2d5a4c7bea88154c434b4708045"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /*
* Allow testing the legacy compatibility entry.
* We use a simple argless macro and disable the fancier tests.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -85,6 +97,20 @@ main(int argc, char *argv[])
</span> if (verbose) printf("realpath(path, NULL) supported.\n");
free((void*)q);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Test nonexistent path with no supplied buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * In some cases (10.6 non-POSIX) this may "succeed" with a bad
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * returned buffer address. We accept either failure or success
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * with a valid buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ q = realpath(NONEX_PATH, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ assert((!q || malloc_size(q)) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ && "realpath(_nonexpath, NULL) returned bad address");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ printf("realpath(nonex_path, NULL) %s.\n", q ? "succeeds" : "fails");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (q && malloc_size(q)) free((void*)q);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #ifndef TEST_MACPORTS_LEGACY_REALPATH
/* Test with name (reference) only */
f = realpath;
</pre><pre style='margin:0'>
</pre>