Revert "Remove unnecessary stat calls from by_dir.c"

This reverts commit d4faa8d63a06a5feff2e5b68695adf9bf8fd1f81. This turns
out to have been load-bearing, but more investigation and tests are
needed. See bug.

Bug: 708
Change-Id: I70eac81dbab01a7d47092719b85a004373851468
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/66928
Reviewed-by: Bob Beck <bbe@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/x509/by_dir.c b/crypto/x509/by_dir.c
index d49220d..16d2dfb 100644
--- a/crypto/x509/by_dir.c
+++ b/crypto/x509/by_dir.c
@@ -66,6 +66,12 @@
 #include "../internal.h"
 #include "internal.h"
 
+#if !defined(OPENSSL_NO_POSIX_IO)
+#include <sys/stat.h>
+#include <sys/types.h>
+#endif
+
+
 typedef struct lookup_dir_hashes_st {
   uint32_t hash;
   int suffix;
@@ -311,6 +317,21 @@
       for (;;) {
         snprintf(b->data, b->max, "%s/%08" PRIx32 ".%s%d", ent->dir, h, postfix,
                  k);
+#if !defined(OPENSSL_NO_POSIX_IO)
+#if defined(_WIN32) && !defined(stat)
+#define stat _stat
+#endif
+        {
+          // TODO(crbug.com/boringssl/708): This call should be redundant with
+          // |X509_load_*_file| failing below, but it turns out to be
+          // load-bearing. Clean this up.
+          struct stat st;
+          if (stat(b->data, &st) < 0) {
+            break;
+          }
+        }
+#endif
+        // found one.
         if (type == X509_LU_X509) {
           if ((X509_load_cert_file(xl, b->data, ent->dir_type)) == 0) {
             break;