<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/2b3094a579daf0e210aca219fc5b2fa569af23cf">https://github.com/macports/macports-legacy-support/commit/2b3094a579daf0e210aca219fc5b2fa569af23cf</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 2b3094a579daf0e210aca219fc5b2fa569af23cf
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Thu Jun 19 13:48:02 2025 -0700

<span style='display:block; white-space:pre;color:#404040;'>    test_clocks: Check boottime result.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Checks for correct result length.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Now preinitializes to garbage instead of zeroes, and checks for valid
</span><span style='display:block; white-space:pre;color:#404040;'>    microseconds.
</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;'>    Detects trouble where expected (without failing test).
</span><span style='display:block; white-space:pre;color:#404040;'>    Passes on all platforms.
</span>---
 test/test_clocks.c | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_clocks.c b/test/test_clocks.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 84bbe84..a92aaab 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_clocks.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_clocks.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -141,6 +141,8 @@ static volatile union scratch_u {
</span>   ONE_ERROR(badptime,"Process/thread time inconsistent") \
   ONE_ERROR(badmach,"Bad mach_time value") \
   ONE_ERROR(badoffset,"Bad continuous time offset") \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  ONE_ERROR(badboottimelen,"Bad boottime result length") \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  ONE_ERROR(badboottimeusecs,"Bad boottime microseconds") \
</span> 
 #define ONE_ERROR(name,text) err_##name,
 typedef enum errs { err_dummy,  /* Avoid zero */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -469,13 +471,33 @@ ts2nsec(timespec_t *ts)
</span> static int
 get_boottime(struct timeval *bt)
 {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret;
</span>   size_t bt_len = sizeof(*bt);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  uint32_t *ip = (uint32_t *) bt;
</span> 
   int bt_mib[] = {CTL_KERN, KERN_BOOTTIME};
   size_t bt_miblen = sizeof(bt_mib) / sizeof(bt_mib[0]);
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  bt->tv_usec = 0;  /* In case OS doesn't store it */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  return sysctl(bt_mib, bt_miblen, bt, &bt_len, NULL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Prefill result with garbage, to detect incomplete stores */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  while (ip < (uint32_t *)(bt + 1)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    *ip++ = 0xDEADBEEFU;
</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;'>+  ret = sysctl(bt_mib, bt_miblen, bt, &bt_len, NULL, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (ret) return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Make sure returned length is correct */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (bt_len != sizeof(*bt)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    errno = -err_badboottimelen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  /* Check for valid microseconds (possibly unwritten) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if ((unsigned int) bt->tv_usec >= MILLION) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    errno = -err_badboottimeusecs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return -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;'>+  return 0;
</span> }
 
 /* Report and check boottime */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -485,14 +507,14 @@ check_boottime(int verbose)
</span>   struct timeval bt, tod;
 
   if (get_boottime(&bt)) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    printf("Can't get boottime: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    printf("Can't get boottime: %s\n", get_errstr(errno));
</span>     return 1;
   }
   if (verbose) {
     printf("  Boot time is %lld.%d\n", LL bt.tv_sec, bt.tv_usec);
   }
   if (gettimeofday(&tod, NULL)) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    printf("Can't get timeofday: %s\n", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    printf("Can't get timeofday: %s\n", get_errstr(errno));
</span>     return 1;
   }
   if (tv2nsec(&bt) > tv2nsec(&tod)) {
</pre><pre style='margin:0'>

</pre>