From 2c8cdd201f0d9f26b2aaf991a759ae46f99ecde5 Mon Sep 17 00:00:00 2001
From: Paul Bakker
Date: Mon, 24 Jun 2013 19:22:42 +0200
Subject: [PATCH] x509parse_crtpath() is now reentrant and uses more portable
stat()
Moved from readdir() to readdir_r() and use stat instead of the less
portable d_type from struct dirent.
(cherry picked from commit cbfcaa9206be586f6bf8ac26586cd63a6c8c8e15)
---
library/x509parse.c | 41 ++++++++++++++++++++++++-----------------
1 file changed, 24 insertions(+), 17 deletions(-)
diff --git a/library/x509parse.c b/library/x509parse.c
index f2e2e2496..bfc4b586a 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -76,6 +76,7 @@
#include
#if !defined(_WIN32)
#include
+#include
#include
#endif
#endif
@@ -1902,12 +1903,9 @@ int x509parse_crtpath( x509_cert *chain, const char *path )
w_ret = x509parse_crtfile( chain, filename );
if( w_ret < 0 )
- {
- ret = w_ret;
- goto cleanup;
- }
-
- ret += w_ret;
+ ret++;
+ else
+ ret += w_ret;
}
while( FindNextFileW( hFind, &file_data ) != 0 );
@@ -1917,28 +1915,37 @@ int x509parse_crtpath( x509_cert *chain, const char *path )
cleanup:
FindClose( hFind );
#else
- int t_ret;
- struct dirent *entry;
+ int t_ret, i;
+ struct stat sb;
+ struct dirent entry, *result = NULL;
char entry_name[255];
DIR *dir = opendir( path );
if( dir == NULL)
return( POLARSSL_ERR_X509_FILE_IO_ERROR );
- while( ( entry = readdir( dir ) ) != NULL )
+ while( ( t_ret = readdir_r( dir, &entry, &result ) ) == 0 )
{
- if( entry->d_type != DT_REG )
+ if( result == NULL )
+ break;
+
+ snprintf( entry_name, sizeof(entry_name), "%s/%s", path, entry.d_name );
+
+ i = stat( entry_name, &sb );
+
+ if( i == -1 )
+ return( POLARSSL_ERR_X509_FILE_IO_ERROR );
+
+ if( !S_ISREG( sb.st_mode ) )
continue;
- snprintf( entry_name, sizeof(entry_name), "%s/%s", path, entry->d_name );
+ // Ignore parse errors
+ //
t_ret = x509parse_crtfile( chain, entry_name );
if( t_ret < 0 )
- {
- ret = t_ret;
- break;
- }
-
- ret += t_ret;
+ ret++;
+ else
+ ret += t_ret;
}
closedir( dir );
#endif