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