mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
Use the new directory reading functions.
This commit is contained in:
parent
a2400fcab8
commit
4083a229b4
127
ssl/ssl_cert.c
127
ssl/ssl_cert.c
@ -116,19 +116,7 @@
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if !defined(OPENSSL_SYS_WIN32) && !defined(OPENSSL_SYS_VMS) && !defined(NeXT) && !defined(MAC_OS_pre_X)
|
||||
#include <dirent.h>
|
||||
#endif
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#ifdef NeXT
|
||||
#include <sys/dir.h>
|
||||
#define dirent direct
|
||||
#endif
|
||||
|
||||
#include "o_dir.h"
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/pem.h>
|
||||
@ -761,131 +749,52 @@ err:
|
||||
* certs may have been added to \c stack.
|
||||
*/
|
||||
|
||||
#ifndef OPENSSL_SYS_WIN32
|
||||
#ifndef OPENSSL_SYS_VMS /* XXXX This may be fixed in the future */
|
||||
#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! */
|
||||
|
||||
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *dir)
|
||||
{
|
||||
DIR *d;
|
||||
struct dirent *dstruct;
|
||||
OPENSSL_DIR_CTX *d = NULL;
|
||||
const char *filename;
|
||||
int ret = 0;
|
||||
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
|
||||
d = opendir(dir);
|
||||
|
||||
/* Note that a side effect is that the CAs will be sorted by name */
|
||||
if(!d)
|
||||
{
|
||||
SYSerr(SYS_F_OPENDIR, get_last_sys_error());
|
||||
ERR_add_error_data(3, "opendir('", dir, "')");
|
||||
SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
while((dstruct=readdir(d)))
|
||||
|
||||
while((filename = OPENSSL_DIR_read(&d, dir)))
|
||||
{
|
||||
char buf[1024];
|
||||
int r;
|
||||
|
||||
if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf)
|
||||
|
||||
if(strlen(dir)+strlen(filename)+2 > sizeof buf)
|
||||
{
|
||||
SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
|
||||
goto err;
|
||||
}
|
||||
|
||||
r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,dstruct->d_name);
|
||||
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
r = BIO_snprintf(buf,sizeof buf,"%s%s",dir,filename);
|
||||
#else
|
||||
r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,filename);
|
||||
#endif
|
||||
if (r <= 0 || r >= (int)sizeof(buf))
|
||||
goto err;
|
||||
if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
|
||||
goto err;
|
||||
}
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (d) closedir(d);
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#else /* OPENSSL_SYS_WIN32 */
|
||||
|
||||
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
|
||||
const char *dir)
|
||||
{
|
||||
WIN32_FIND_DATA FindFileData;
|
||||
HANDLE hFind;
|
||||
int ret = 0;
|
||||
#ifdef OPENSSL_SYS_WINCE
|
||||
WCHAR* wdir = NULL;
|
||||
#endif
|
||||
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
|
||||
|
||||
#ifdef OPENSSL_SYS_WINCE
|
||||
/* convert strings to UNICODE */
|
||||
{
|
||||
BOOL result = FALSE;
|
||||
int i;
|
||||
wdir = malloc((strlen(dir)+1)*2);
|
||||
if (wdir == NULL)
|
||||
goto err_noclose;
|
||||
for (i=0; i<(int)strlen(dir)+1; i++)
|
||||
wdir[i] = (short)dir[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OPENSSL_SYS_WINCE
|
||||
hFind = FindFirstFile(wdir, &FindFileData);
|
||||
#else
|
||||
hFind = FindFirstFile(dir, &FindFileData);
|
||||
#endif
|
||||
/* Note that a side effect is that the CAs will be sorted by name */
|
||||
if(hFind == INVALID_HANDLE_VALUE)
|
||||
if (errno)
|
||||
{
|
||||
SYSerr(SYS_F_OPENDIR, get_last_sys_error());
|
||||
ERR_add_error_data(3, "opendir('", dir, "')");
|
||||
ERR_add_error_data(3, "OPENSSL_DIR_read(&ctx, '", dir, "')");
|
||||
SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
|
||||
goto err_noclose;
|
||||
goto err;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
char buf[1024];
|
||||
int r;
|
||||
|
||||
#ifdef OPENSSL_SYS_WINCE
|
||||
if(strlen(dir)+_tcslen(FindFileData.cFileName)+2 > sizeof buf)
|
||||
#else
|
||||
if(strlen(dir)+strlen(FindFileData.cFileName)+2 > sizeof buf)
|
||||
#endif
|
||||
{
|
||||
SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
|
||||
goto err;
|
||||
}
|
||||
|
||||
r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,FindFileData.cFileName);
|
||||
if (r <= 0 || r >= sizeof buf)
|
||||
goto err;
|
||||
if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
|
||||
goto err;
|
||||
}
|
||||
while (FindNextFile(hFind, &FindFileData) != FALSE);
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
FindClose(hFind);
|
||||
err_noclose:
|
||||
#ifdef OPENSSL_SYS_WINCE
|
||||
if (wdir != NULL)
|
||||
free(wdir);
|
||||
#endif
|
||||
if (d) OPENSSL_DIR_end(&d);
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user