]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/cryptsetup/cryptsetup-keyfile.c
fileio: bump limit for read_full_file() and friends to 64M
[thirdparty/systemd.git] / src / cryptsetup / cryptsetup-keyfile.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
23769fb3 2
1e2f3230 3#include "cryptsetup-keyfile.h"
e060ed32 4#include "fileio.h"
23769fb3 5#include "path-util.h"
23769fb3
LP
6#include "strv.h"
7
e060ed32 8int find_key_file(
23769fb3
LP
9 const char *key_file,
10 char **search_path,
e060ed32 11 const char *bindname,
23769fb3
LP
12 void **ret_key,
13 size_t *ret_key_size) {
14
e060ed32 15 char **i;
23769fb3
LP
16 int r;
17
18 assert(key_file);
19 assert(ret_key);
20 assert(ret_key_size);
21
22 if (strv_isempty(search_path) || path_is_absolute(key_file)) {
23769fb3 23
e060ed32
LP
24 r = read_full_file_full(
25 AT_FDCWD, key_file, UINT64_MAX, SIZE_MAX,
26 READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET,
27 bindname,
28 (char**) ret_key, ret_key_size);
23769fb3 29 if (r < 0)
e060ed32 30 return log_error_errno(r, "Failed to load key file '%s': %m", key_file);
23769fb3 31
e060ed32 32 return 1;
23769fb3
LP
33 }
34
e060ed32 35 STRV_FOREACH(i, search_path) {
c2b2df60 36 _cleanup_free_ char *joined = NULL;
e060ed32
LP
37
38 joined = path_join(*i, key_file);
39 if (!joined)
40 return log_oom();
41
42 r = read_full_file_full(
43 AT_FDCWD, joined, UINT64_MAX, SIZE_MAX,
44 READ_FULL_FILE_SECURE|READ_FULL_FILE_WARN_WORLD_READABLE|READ_FULL_FILE_CONNECT_SOCKET,
45 bindname,
46 (char**) ret_key, ret_key_size);
47 if (r >= 0)
48 return 1;
49 if (r != -ENOENT)
50 return log_error_errno(r, "Failed to load key file '%s': %m", key_file);
51 }
23769fb3 52
e060ed32
LP
53 /* Search path supplied, but file not found, report by returning NULL, but not failing */
54 *ret_key = NULL;
55 *ret_key_size = 0;
56 return 0;
23769fb3 57}