1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <contrib/restricted/google/boringssl/include/openssl/ssl.h>
#if !defined(OPENSSL_WINDOWS) && !defined(OPENSSL_PNACL) && \
!defined(OPENSSL_NO_FILESYSTEM)
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <contrib/restricted/google/boringssl/include/openssl/err.h>
#include <contrib/restricted/google/boringssl/include/openssl/mem.h>
int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
const char *path) {
DIR *dir = opendir(path);
if (dir == nullptr) {
OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB);
ERR_add_error_data(3, "opendir('", dir, "')");
return 0;
}
int ret = 0;
for (;;) {
// |readdir| may fail with or without setting |errno|.
errno = 0;
struct dirent *dirent = readdir(dir);
if (dirent == nullptr) {
if (errno) {
OPENSSL_PUT_ERROR(SSL, ERR_R_SYS_LIB);
ERR_add_error_data(3, "readdir('", path, "')");
} else {
ret = 1;
}
break;
}
char buf[1024];
if (strlen(path) + strlen(dirent->d_name) + 2 > sizeof(buf)) {
OPENSSL_PUT_ERROR(SSL, SSL_R_PATH_TOO_LONG);
break;
}
int r = snprintf(buf, sizeof(buf), "%s/%s", path, dirent->d_name);
if (r <= 0 ||
r >= (int)sizeof(buf) ||
!SSL_add_file_cert_subjects_to_stack(stack, buf)) {
break;
}
}
closedir(dir);
return ret;
}
#endif // !WINDOWS && !PNACL && !OPENSSL_NO_FILESYSTEM
|