| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| |
| #include "cryptsetup-keyfile.h" |
| #include "fileio.h" |
| #include "path-util.h" |
| #include "strv.h" |
| |
| int find_key_file( |
| const char *key_file, |
| char **search_path, |
| const char *bindname, |
| void **ret_key, |
| size_t *ret_key_size) { |
| |
| char **i; |
| int r; |
| |
| assert(key_file); |
| assert(ret_key); |
| assert(ret_key_size); |
| |
| if (strv_isempty(search_path) || path_is_absolute(key_file)) { |
| |
| r = read_full_file_full( |
| AT_FDCWD, key_file, UINT64_MAX, SIZE_MAX, |
| READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET, |
| bindname, |
| (char**) ret_key, ret_key_size); |
| if (r == -E2BIG) |
| return log_error_errno(r, "Key file '%s' too large.", key_file); |
| if (r < 0) |
| return log_error_errno(r, "Failed to load key file '%s': %m", key_file); |
| |
| return 1; |
| } |
| |
| STRV_FOREACH(i, search_path) { |
| _cleanup_free_ char *joined = NULL; |
| |
| joined = path_join(*i, key_file); |
| if (!joined) |
| return log_oom(); |
| |
| r = read_full_file_full( |
| AT_FDCWD, joined, UINT64_MAX, SIZE_MAX, |
| READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET, |
| bindname, |
| (char**) ret_key, ret_key_size); |
| if (r >= 0) |
| return 1; |
| if (r == -E2BIG) { |
| log_warning_errno(r, "Key file '%s' too large, ignoring.", key_file); |
| continue; |
| } |
| if (r != -ENOENT) |
| return log_error_errno(r, "Failed to load key file '%s': %m", key_file); |
| } |
| |
| /* Search path supplied, but file not found, report by returning NULL, but not failing */ |
| *ret_key = NULL; |
| *ret_key_size = 0; |
| return 0; |
| } |