From cbfcaa9206be586f6bf8ac26586cd63a6c8c8e15 Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Thu, 13 Jun 2013 09:20:25 +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. --- ChangeLog | 1 + library/x509parse.c | 41 ++++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5fd28f31d..a4e24d9d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,7 @@ Bugfix * ssl_parse_certificate() now calls x509parse_crt_der() directly instead of the x509parse_crt() wrapper that can also parse PEM certificates + * x509parse_crtpath() is now reentrant and uses more portable stat() = Version 1.2.7 released 2013-04-13 Features diff --git a/library/x509parse.c b/library/x509parse.c index 08297ee65..d2bfddc74 100644 --- a/library/x509parse.c +++ b/library/x509parse.c @@ -75,6 +75,7 @@ #include #if !defined(_WIN32) #include +#include #include #endif #endif @@ -1919,12 +1920,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 ); @@ -1934,28 +1932,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