summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/basic/creds-util.h4
-rw-r--r--src/basic/fd-util.c2
-rw-r--r--src/basic/fd-util.h3
-rw-r--r--src/boot/efi/meson.build41
-rw-r--r--src/core/load-fragment.c98
-rw-r--r--src/core/unit-printf.c6
-rw-r--r--src/core/unit-printf.h21
-rw-r--r--src/libsystemd-network/network-internal.h2
-rw-r--r--src/libsystemd-network/sd-dhcp-client.c2
-rw-r--r--src/libsystemd-network/sd-dhcp-lease.c60
-rw-r--r--src/libsystemd/sd-netlink/generic-netlink.c2
-rw-r--r--src/libsystemd/sd-netlink/netlink-message.c8
-rw-r--r--src/libsystemd/sd-netlink/netlink-slot.c6
-rw-r--r--src/libsystemd/sd-netlink/rtnl-message.c62
-rw-r--r--src/libsystemd/sd-netlink/sd-netlink.c4
-rw-r--r--src/partition/repart.c10
-rw-r--r--src/resolve/resolved-conf.c2
-rw-r--r--src/resolve/resolved-dnssd.c2
-rw-r--r--src/shared/dns-domain.c2
-rw-r--r--src/shared/gpt.c2
-rw-r--r--src/shared/gpt.h3
-rw-r--r--src/shared/install-printf.c4
-rw-r--r--src/shared/install-printf.h9
-rw-r--r--src/shared/install.c8
-rw-r--r--src/shared/specifier.c39
-rw-r--r--src/shared/specifier.h2
-rw-r--r--src/systemd/sd-dhcp-client.h2
-rw-r--r--src/systemd/sd-dhcp-lease.h58
-rw-r--r--src/systemd/sd-netlink.h82
-rw-r--r--src/sysusers/sysusers.c10
-rw-r--r--src/test/test-load-fragment.c2
-rw-r--r--src/test/test-specifier.c35
-rw-r--r--src/test/test-strv.c34
-rw-r--r--src/tmpfiles/tmpfiles.c6
34 files changed, 335 insertions, 298 deletions
diff --git a/src/basic/creds-util.h b/src/basic/creds-util.h
index 5e33ca3776..7310249424 100644
--- a/src/basic/creds-util.h
+++ b/src/basic/creds-util.h
@@ -5,6 +5,10 @@
#include <stdbool.h>
#include <sys/types.h>
+#include "fd-util.h"
+
+#define CREDENTIAL_NAME_MAX FDNAME_MAX
+
bool credential_name_valid(const char *s);
int get_credentials_dir(const char **ret);
diff --git a/src/basic/fd-util.c b/src/basic/fd-util.c
index d63f012ad5..1a873601b2 100644
--- a/src/basic/fd-util.c
+++ b/src/basic/fd-util.c
@@ -454,7 +454,7 @@ bool fdname_is_valid(const char *s) {
return false;
}
- return p - s < 256;
+ return p - s <= FDNAME_MAX;
}
int fd_get_path(int fd, char **ret) {
diff --git a/src/basic/fd-util.h b/src/basic/fd-util.h
index f05c2b5a15..aa8e082b38 100644
--- a/src/basic/fd-util.h
+++ b/src/basic/fd-util.h
@@ -8,6 +8,9 @@
#include "macro.h"
+/* maximum length of fdname */
+#define FDNAME_MAX 255
+
/* Make sure we can distinguish fd 0 and NULL */
#define FD_TO_PTR(fd) INT_TO_PTR((fd)+1)
#define PTR_TO_FD(p) (PTR_TO_INT(p)-1)
diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build
index ab5530bec1..26e6dc79fc 100644
--- a/src/boot/efi/meson.build
+++ b/src/boot/efi/meson.build
@@ -224,6 +224,7 @@ if have_gnu_efi
'-Bsymbolic',
'-nostdlib',
'-znocombreloc',
+ '--build-id=sha1',
'-L', efi_libdir,
efi_crt0]
if ['aarch64', 'arm', 'riscv64'].contains(efi_arch)
@@ -254,24 +255,22 @@ if have_gnu_efi
libgcc_file_name = run_command(efi_cc + ['-print-libgcc-file-name']).stdout().strip()
systemd_boot_efi_name = 'systemd-boot@0@.efi'.format(EFI_MACHINE_TYPE_NAME)
+ stub_elf_name = 'linux@0@.elf.stub'.format(EFI_MACHINE_TYPE_NAME)
stub_efi_name = 'linux@0@.efi.stub'.format(EFI_MACHINE_TYPE_NAME)
no_undefined_symbols = find_program('no-undefined-symbols.sh')
- foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects],
- ['stub.so', stub_efi_name, stub_objects]]
+ efi_stubs = []
+ foreach tuple : [['systemd_boot.so', systemd_boot_efi_name, systemd_boot_objects, false],
+ [stub_elf_name, stub_efi_name, stub_objects, true]]
so = custom_target(
tuple[0],
input : tuple[2],
output : tuple[0],
- command : [efi_ld, '-o', '@OUTPUT@'] +
- efi_ldflags + tuple[2] +
- ['-lefi', '-lgnuefi', libgcc_file_name])
-
- if want_tests != 'false'
- test('no-undefined-symbols-' + tuple[0],
- no_undefined_symbols,
- args : [so])
- endif
+ command : [efi_ld, '-o', '@OUTPUT@',
+ efi_ldflags, tuple[2],
+ '-lefi', '-lgnuefi', libgcc_file_name],
+ install : tuple[3],
+ install_dir : bootlibdir)
stub = custom_target(
tuple[1],
@@ -284,22 +283,26 @@ if have_gnu_efi
'-j', '.data',
'-j', '.dynamic',
'-j', '.dynsym',
- '-j', '.rel*']
- + efi_format +
- ['@INPUT@', '@OUTPUT@'],
+ '-j', '.rel*',
+ efi_format,
+ '@INPUT@', '@OUTPUT@'],
install : true,
install_dir : bootlibdir)
- set_variable(tuple[0].underscorify(), so)
- set_variable(tuple[0].underscorify() + '_stub', stub)
+ efi_stubs += [[so, stub]]
+
+ if want_tests != 'false'
+ test('no-undefined-symbols-' + tuple[0],
+ no_undefined_symbols,
+ args : so)
+ endif
endforeach
############################################################
test_efi_disk_img = custom_target(
'test-efi-disk.img',
- input : [systemd_boot_so, stub_so_stub],
+ input : [efi_stubs[0][0], efi_stubs[1][1]],
output : 'test-efi-disk.img',
- command : [test_efi_create_disk_sh, '@OUTPUT@',
- '@INPUT0@', '@INPUT1@', splash_bmp])
+ command : [test_efi_create_disk_sh, '@OUTPUT@','@INPUT@', splash_bmp])
endif
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 2399089492..4eba2d1c02 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -293,15 +293,7 @@ int config_parse_unit_path_printf(
assert(rvalue);
assert(u);
- /* Let's not bother with anything that is too long */
- if (strlen(rvalue) >= PATH_MAX) {
- log_syntax(unit, fatal ? LOG_ERR : LOG_WARNING, filename, line, 0,
- "%s value too long%s.",
- lvalue, fatal ? "" : ", ignoring");
- return fatal ? -ENAMETOOLONG : 0;
- }
-
- r = unit_full_printf(u, rvalue, &k);
+ r = unit_path_printf(u, rvalue, &k);
if (r < 0) {
log_syntax(unit, fatal ? LOG_ERR : LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s'%s: %m",
@@ -352,7 +344,7 @@ int config_parse_unit_path_strv_printf(
return 0;
}
- r = unit_full_printf(u, word, &k);
+ r = unit_path_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", word);
@@ -433,7 +425,7 @@ int config_parse_socket_listen(
if (ltype != SOCKET_SOCKET) {
_cleanup_free_ char *k = NULL;
- r = unit_full_printf(UNIT(s), rvalue, &k);
+ r = unit_path_printf(UNIT(s), rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -455,7 +447,7 @@ int config_parse_socket_listen(
} else if (streq(lvalue, "ListenNetlink")) {
_cleanup_free_ char *k = NULL;
- r = unit_full_printf(UNIT(s), rvalue, &k);
+ r = unit_path_printf(UNIT(s), rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -472,7 +464,7 @@ int config_parse_socket_listen(
} else {
_cleanup_free_ char *k = NULL;
- r = unit_full_printf(UNIT(s), rvalue, &k);
+ r = unit_path_printf(UNIT(s), rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -769,7 +761,7 @@ int config_parse_exec(
f++;
}
- r = unit_full_printf(u, f, &path);
+ r = unit_path_printf(u, f, &path);
if (r < 0) {
log_syntax(unit, ignore ? LOG_WARNING : LOG_ERR, filename, line, r,
"Failed to resolve unit specifiers in '%s'%s: %m",
@@ -856,7 +848,7 @@ int config_parse_exec(
if (r < 0)
return ignore ? 0 : -ENOEXEC;
- r = unit_full_printf(u, word, &resolved);
+ r = unit_path_printf(u, word, &resolved);
if (r < 0) {
log_syntax(unit, ignore ? LOG_WARNING : LOG_ERR, filename, line, r,
"Failed to resolve unit specifiers in %s%s: %m",
@@ -956,7 +948,7 @@ int config_parse_exec_input(
if (n) {
_cleanup_free_ char *resolved = NULL;
- r = unit_full_printf(u, n, &resolved);
+ r = unit_fd_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", n);
return 0;
@@ -976,7 +968,7 @@ int config_parse_exec_input(
} else if ((n = startswith(rvalue, "file:"))) {
_cleanup_free_ char *resolved = NULL;
- r = unit_full_printf(u, n, &resolved);
+ r = unit_path_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", n);
return 0;
@@ -1040,7 +1032,7 @@ int config_parse_exec_input_text(
return 0;
}
- r = unit_full_printf(u, unescaped, &resolved);
+ r = unit_full_printf_full(u, unescaped, EXEC_STDIN_DATA_MAX, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", unescaped);
@@ -1155,7 +1147,7 @@ int config_parse_exec_output(
n = startswith(rvalue, "fd:");
if (n) {
- r = unit_full_printf(u, n, &resolved);
+ r = unit_fd_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s: %m", n);
return 0;
@@ -1180,7 +1172,7 @@ int config_parse_exec_output(
} else if ((n = startswith(rvalue, "file:"))) {
- r = unit_full_printf(u, n, &resolved);
+ r = unit_path_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", n);
return 0;
@@ -1194,7 +1186,7 @@ int config_parse_exec_output(
} else if ((n = startswith(rvalue, "append:"))) {
- r = unit_full_printf(u, n, &resolved);
+ r = unit_path_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", n);
return 0;
@@ -1208,7 +1200,7 @@ int config_parse_exec_output(
} else if ((n = startswith(rvalue, "truncate:"))) {
- r = unit_full_printf(u, n, &resolved);
+ r = unit_path_printf(u, n, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", n);
return 0;
@@ -2080,7 +2072,7 @@ int config_parse_path_spec(const char *unit,
return 0;
}
- r = unit_full_printf(UNIT(p), rvalue, &k);
+ r = unit_path_printf(UNIT(p), rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue);
return 0;
@@ -2175,7 +2167,7 @@ int config_parse_fdname(
return 0;
}
- r = unit_full_printf(UNIT(s), rvalue, &p);
+ r = unit_fd_printf(UNIT(s), rvalue, &p);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -2264,7 +2256,7 @@ int config_parse_bus_name(
assert(rvalue);
assert(u);
- r = unit_full_printf(u, rvalue, &k);
+ r = unit_full_printf_full(u, rvalue, SD_BUS_MAXIMUM_NAME_LENGTH, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue);
return 0;
@@ -2557,7 +2549,7 @@ int config_parse_working_directory(
} else {
_cleanup_free_ char *k = NULL;
- r = unit_full_printf(u, rvalue, &k);
+ r = unit_path_printf(u, rvalue, &k);
if (r < 0) {
log_syntax(unit, missing_ok ? LOG_WARNING : LOG_ERR, filename, line, r,
"Failed to resolve unit specifiers in working directory path '%s'%s: %m",
@@ -2604,7 +2596,7 @@ int config_parse_unit_env_file(const char *unit,
return 0;
}
- r = unit_full_printf(u, rvalue, &n);
+ r = unit_full_printf_full(u, rvalue, PATH_MAX, &n);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -2665,7 +2657,7 @@ int config_parse_environ(
return 0;
if (u) {
- r = unit_full_printf(u, word, &resolved);
+ r = unit_env_printf(u, word, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in %s, ignoring: %m", word);
@@ -2730,7 +2722,7 @@ int config_parse_pass_environ(
break;
if (u) {
- r = unit_full_printf(u, word, &k);
+ r = unit_env_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve specifiers in %s, ignoring: %m", word);
@@ -2805,7 +2797,7 @@ int config_parse_unset_environ(
break;
if (u) {
- r = unit_full_printf(u, word, &k);
+ r = unit_env_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in %s, ignoring: %m", word);
@@ -2932,7 +2924,7 @@ int config_parse_log_namespace(
return 0;
}
- r = unit_full_printf(u, rvalue, &k);
+ r = unit_full_printf_full(u, rvalue, NAME_MAX, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue);
return 0;
@@ -2985,7 +2977,7 @@ int config_parse_unit_condition_path(
if (negate)
rvalue++;
- r = unit_full_printf(u, rvalue, &p);
+ r = unit_path_printf(u, rvalue, &p);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", rvalue);
return 0;
@@ -3090,7 +3082,7 @@ int config_parse_unit_requires_mounts_for(
if (r == 0)
return 0;
- r = unit_full_printf(u, word, &resolved);
+ r = unit_path_printf(u, word, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", word);
continue;
@@ -3960,7 +3952,7 @@ int config_parse_device_allow(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4026,7 +4018,7 @@ int config_parse_io_device_weight(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4095,7 +4087,7 @@ int config_parse_io_device_latency(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4165,7 +4157,7 @@ int config_parse_io_limit(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4251,7 +4243,7 @@ int config_parse_blockio_device_weight(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4324,7 +4316,7 @@ int config_parse_blockio_bandwidth(
return 0;
}
- r = unit_full_printf(userdata, path, &resolved);
+ r = unit_path_printf(userdata, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in '%s', ignoring: %m", path);
@@ -4440,7 +4432,7 @@ int config_parse_exec_directories(
if (r == 0)
return 0;
- r = unit_full_printf(u, word, &k);
+ r = unit_path_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in \"%s\", ignoring: %m", word);
@@ -4503,7 +4495,7 @@ int config_parse_set_credential(
return 0;
}
- r = unit_full_printf(u, word, &k);
+ r = unit_cred_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in \"%s\", ignoring: %m", word);
return 0;
@@ -4588,7 +4580,7 @@ int config_parse_load_credential(
return 0;
}
- r = unit_full_printf(u, word, &k);
+ r = unit_cred_printf(u, word, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in \"%s\", ignoring: %m", word);
return 0;
@@ -4605,7 +4597,7 @@ int config_parse_load_credential(
if (!q)
return log_oom();
} else {
- r = unit_full_printf(u, p, &q);
+ r = unit_path_printf(u, p, &q);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in \"%s\", ignoring: %m", p);
return 0;
@@ -4740,7 +4732,7 @@ int config_parse_namespace_path_strv(
w++;
}
- r = unit_full_printf(u, w, &resolved);
+ r = unit_path_printf(u, w, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s: %m", w);
continue;
@@ -4820,7 +4812,7 @@ int config_parse_temporary_filesystems(
continue;
}
- r = unit_full_printf(u, path, &resolved);
+ r = unit_path_printf(u, path, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in %s, ignoring: %m", path);
continue;
@@ -4881,7 +4873,7 @@ int config_parse_bind_paths(
if (r == 0)
break;
- r = unit_full_printf(u, source, &sresolved);
+ r = unit_full_printf_full(u, source, PATH_MAX, &sresolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in \"%s\", ignoring: %m", source);
@@ -4912,7 +4904,7 @@ int config_parse_bind_paths(
continue;
}
- r = unit_full_printf(u, destination, &dresolved);
+ r = unit_path_printf(u, destination, &dresolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve specifiers in \"%s\", ignoring: %m", destination);
@@ -5028,7 +5020,7 @@ int config_parse_mount_images(
s++;
}
- r = unit_full_printf(u, s, &sresolved);
+ r = unit_path_printf(u, s, &sresolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in \"%s\", ignoring: %m", s);
@@ -5044,7 +5036,7 @@ int config_parse_mount_images(
continue;
}
- r = unit_full_printf(u, second, &dresolved);
+ r = unit_path_printf(u, second, &dresolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve specifiers in \"%s\", ignoring: %m", second);
@@ -5187,7 +5179,7 @@ int config_parse_extension_images(
s++;
}
- r = unit_full_printf(u, s, &sresolved);
+ r = unit_path_printf(u, s, &sresolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to resolve unit specifiers in \"%s\", ignoring: %m", s);
@@ -5416,7 +5408,7 @@ int config_parse_pid_file(
return 0;
}
- r = unit_full_printf(u, rvalue, &k);
+ r = unit_path_printf(u, rvalue, &k);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -5537,7 +5529,7 @@ int config_parse_ip_filter_bpf_progs(
return 0;
}
- r = unit_full_printf(u, rvalue, &resolved);
+ r = unit_path_printf(u, rvalue, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
@@ -5611,7 +5603,7 @@ int config_parse_bpf_foreign_program(
return 0;
}
- r = unit_full_printf(u, rvalue, &resolved);
+ r = unit_path_printf(u, rvalue, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to resolve unit specifiers in '%s', ignoring: %m", rvalue);
return 0;
diff --git a/src/core/unit-printf.c b/src/core/unit-printf.c
index 8e50a81b97..ee8b0b3de8 100644
--- a/src/core/unit-printf.c
+++ b/src/core/unit-printf.c
@@ -201,10 +201,10 @@ int unit_name_printf(const Unit *u, const char* format, char **ret) {
assert(format);
assert(ret);
- return specifier_printf(format, table, u, ret);
+ return specifier_printf(format, UNIT_NAME_MAX, table, u, ret);
}
-int unit_full_printf(const Unit *u, const char *format, char **ret) {
+int unit_full_printf_full(const Unit *u, const char *format, size_t max_length, char **ret) {
/* This is similar to unit_name_printf() but also supports unescaping. Also, adds a couple of additional codes
* (which are likely not suitable for unescaped inclusion in unit names):
*
@@ -265,5 +265,5 @@ int unit_full_printf(const Unit *u, const char *format, char **ret) {
{}
};
- return specifier_printf(format, table, u, ret);
+ return specifier_printf(format, max_length, table, u, ret);
}
diff --git a/src/core/unit-printf.h b/src/core/unit-printf.h
index de5183c113..2df07db26d 100644
--- a/src/core/unit-printf.h
+++ b/src/core/unit-printf.h
@@ -1,7 +1,26 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#pragma once
+#include "creds-util.h"
+#include "env-util.h"
+#include "fd-util.h"
+#include "fileio.h"
#include "unit.h"
int unit_name_printf(const Unit *u, const char* text, char **ret);
-int unit_full_printf(const Unit *u, const char *text, char **ret);
+int unit_full_printf_full(const Unit *u, const char *text, size_t max_length, char **ret);
+static inline int unit_full_printf(const Unit *u, const char *text, char **ret) {
+ return unit_full_printf_full(u, text, LONG_LINE_MAX, ret);
+}
+static inline int unit_path_printf(const Unit *u, const char *text, char **ret) {
+ return unit_full_printf_full(u, text, PATH_MAX-1, ret);
+}
+static inline int unit_fd_printf(const Unit *u, const char *text, char **ret) {
+ return unit_full_printf_full(u, text, FDNAME_MAX, ret);
+}
+static inline int unit_cred_printf(const Unit *u, const char *text, char **ret) {
+ return unit_full_printf_full(u, text, CREDENTIAL_NAME_MAX, ret);
+}
+static inline int unit_env_printf(const Unit *u, const char *text, char **ret) {
+ return unit_full_printf_full(u, text, sc_arg_max(), ret);
+}
diff --git a/src/libsystemd-network/network-internal.h b/src/libsystemd-network/network-internal.h
index 9e7a67cbe3..e5b853c0cd 100644
--- a/src/libsystemd-network/network-internal.h
+++ b/src/libsystemd-network/network-internal.h
@@ -27,5 +27,5 @@ int deserialize_dhcp_routes(struct sd_dhcp_route **ret, size_t *ret_size, size_t
/* It is not necessary to add deserialize_dhcp_option(). Use unhexmem() instead. */
int serialize_dhcp_option(FILE *f, const char *key, const void *data, size_t size);
-int dhcp_lease_save(const sd_dhcp_lease *lease, const char *lease_file);
+int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file);
int dhcp_lease_load(sd_dhcp_lease **ret, const char *lease_file);
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 11492bca97..a15ff8af33 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -2052,7 +2052,7 @@ int sd_dhcp_client_send_renew(sd_dhcp_client *client) {
return client_initialize_time_events(client);
}
-int sd_dhcp_client_is_running(const sd_dhcp_client *client) {
+int sd_dhcp_client_is_running(sd_dhcp_client *client) {
if (!client)
return 0;
diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c
index 37e37ef780..6d88c88e6b 100644
--- a/src/libsystemd-network/sd-dhcp-lease.c
+++ b/src/libsystemd-network/sd-dhcp-lease.c
@@ -31,7 +31,7 @@
#include "tmpfile-util.h"
#include "unaligned.h"
-int sd_dhcp_lease_get_address(const sd_dhcp_lease *lease, struct in_addr *addr) {
+int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -42,7 +42,7 @@ int sd_dhcp_lease_get_address(const sd_dhcp_lease *lease, struct in_addr *addr)
return 0;
}
-int sd_dhcp_lease_get_broadcast(const sd_dhcp_lease *lease, struct in_addr *addr) {
+int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -53,7 +53,7 @@ int sd_dhcp_lease_get_broadcast(const sd_dhcp_lease *lease, struct in_addr *addr
return 0;
}
-int sd_dhcp_lease_get_lifetime(const sd_dhcp_lease *lease, uint32_t *lifetime) {
+int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime) {
assert_return(lease, -EINVAL);
assert_return(lifetime, -EINVAL);
@@ -64,7 +64,7 @@ int sd_dhcp_lease_get_lifetime(const sd_dhcp_lease *lease, uint32_t *lifetime) {
return 0;
}
-int sd_dhcp_lease_get_t1(const sd_dhcp_lease *lease, uint32_t *t1) {
+int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1) {
assert_return(lease, -EINVAL);
assert_return(t1, -EINVAL);
@@ -75,7 +75,7 @@ int sd_dhcp_lease_get_t1(const sd_dhcp_lease *lease, uint32_t *t1) {
return 0;
}
-int sd_dhcp_lease_get_t2(const sd_dhcp_lease *lease, uint32_t *t2) {
+int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2) {
assert_return(lease, -EINVAL);
assert_return(t2, -EINVAL);
@@ -86,7 +86,7 @@ int sd_dhcp_lease_get_t2(const sd_dhcp_lease *lease, uint32_t *t2) {
return 0;
}
-int sd_dhcp_lease_get_mtu(const sd_dhcp_lease *lease, uint16_t *mtu) {
+int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu) {
assert_return(lease, -EINVAL);
assert_return(mtu, -EINVAL);
@@ -98,7 +98,7 @@ int sd_dhcp_lease_get_mtu(const sd_dhcp_lease *lease, uint16_t *mtu) {
}
int sd_dhcp_lease_get_servers(
- const sd_dhcp_lease *lease,
+ sd_dhcp_lease *lease,
sd_dhcp_lease_server_type_t what,
const struct in_addr **addr) {
@@ -114,26 +114,26 @@ int sd_dhcp_lease_get_servers(
return (int) lease->servers[what].size;
}
-int sd_dhcp_lease_get_dns(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_DNS, addr);
}
-int sd_dhcp_lease_get_ntp(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_NTP, addr);
}
-int sd_dhcp_lease_get_sip(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_SIP, addr);
}
-int sd_dhcp_lease_get_pop3(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_pop3(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_POP3, addr);
}
-int sd_dhcp_lease_get_smtp(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_smtp(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_SMTP, addr);
}
-int sd_dhcp_lease_get_lpr(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_lpr(sd_dhcp_lease *lease, const struct in_addr **addr) {
return sd_dhcp_lease_get_servers(lease, SD_DHCP_LEASE_LPR, addr);
}
-int sd_dhcp_lease_get_domainname(const sd_dhcp_lease *lease, const char **domainname) {
+int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname) {
assert_return(lease, -EINVAL);
assert_return(domainname, -EINVAL);
@@ -144,7 +144,7 @@ int sd_dhcp_lease_get_domainname(const sd_dhcp_lease *lease, const char **domain
return 0;
}
-int sd_dhcp_lease_get_hostname(const sd_dhcp_lease *lease, const char **hostname) {
+int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname) {
assert_return(lease, -EINVAL);
assert_return(hostname, -EINVAL);
@@ -155,7 +155,7 @@ int sd_dhcp_lease_get_hostname(const sd_dhcp_lease *lease, const char **hostname
return 0;
}
-int sd_dhcp_lease_get_root_path(const sd_dhcp_lease *lease, const char **root_path) {
+int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path) {
assert_return(lease, -EINVAL);
assert_return(root_path, -EINVAL);
@@ -166,7 +166,7 @@ int sd_dhcp_lease_get_root_path(const sd_dhcp_lease *lease, const char **root_pa
return 0;
}
-int sd_dhcp_lease_get_router(const sd_dhcp_lease *lease, const struct in_addr **addr) {
+int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -177,7 +177,7 @@ int sd_dhcp_lease_get_router(const sd_dhcp_lease *lease, const struct in_addr **
return (int) lease->router_size;
}
-int sd_dhcp_lease_get_netmask(const sd_dhcp_lease *lease, struct in_addr *addr) {
+int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -188,7 +188,7 @@ int sd_dhcp_lease_get_netmask(const sd_dhcp_lease *lease, struct in_addr *addr)
return 0;
}
-int sd_dhcp_lease_get_server_identifier(const sd_dhcp_lease *lease, struct in_addr *addr) {
+int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -199,7 +199,7 @@ int sd_dhcp_lease_get_server_identifier(const sd_dhcp_lease *lease, struct in_ad
return 0;
}
-int sd_dhcp_lease_get_next_server(const sd_dhcp_lease *lease, struct in_addr *addr) {
+int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr) {
assert_return(lease, -EINVAL);
assert_return(addr, -EINVAL);
@@ -214,7 +214,7 @@ int sd_dhcp_lease_get_next_server(const sd_dhcp_lease *lease, struct in_addr *ad
* The returned routes array must be freed by the caller.
* Route objects have the same lifetime of the lease and must not be freed.
*/
-int sd_dhcp_lease_get_routes(const sd_dhcp_lease *lease, sd_dhcp_route ***routes) {
+int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, sd_dhcp_route ***routes) {
sd_dhcp_route **ret;
unsigned i;
@@ -235,7 +235,7 @@ int sd_dhcp_lease_get_routes(const sd_dhcp_lease *lease, sd_dhcp_route ***routes
return (int) lease->static_route_size;
}
-int sd_dhcp_lease_get_search_domains(const sd_dhcp_lease *lease, char ***domains) {
+int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains) {
size_t r;
assert_return(lease, -EINVAL);
@@ -250,7 +250,7 @@ int sd_dhcp_lease_get_search_domains(const sd_dhcp_lease *lease, char ***domains
return -ENODATA;
}
-int sd_dhcp_lease_get_vendor_specific(const sd_dhcp_lease *lease, const void **data, size_t *data_len) {
+int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len) {
assert_return(lease, -EINVAL);
assert_return(data, -EINVAL);
assert_return(data_len, -EINVAL);
@@ -868,7 +868,7 @@ int dhcp_lease_new(sd_dhcp_lease **ret) {
return 0;
}
-int dhcp_lease_save(const sd_dhcp_lease *lease, const char *lease_file) {
+int dhcp_lease_save(sd_dhcp_lease *lease, const char *lease_file) {
_cleanup_(unlink_and_freep) char *temp_path = NULL;
_cleanup_fclose_ FILE *f = NULL;
struct sd_dhcp_raw_option *option;
@@ -1313,7 +1313,7 @@ int dhcp_lease_set_default_subnet_mask(sd_dhcp_lease *lease) {
return 0;
}
-int sd_dhcp_lease_get_client_id(const sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len) {
+int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len) {
assert_return(lease, -EINVAL);
assert_return(client_id, -EINVAL);
assert_return(client_id_len, -EINVAL);
@@ -1348,7 +1348,7 @@ int dhcp_lease_set_client_id(sd_dhcp_lease *lease, const void *client_id, size_t
return 0;
}
-int sd_dhcp_lease_get_timezone(const sd_dhcp_lease *lease, const char **tz) {
+int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **tz) {
assert_return(lease, -EINVAL);
assert_return(tz, -EINVAL);
@@ -1359,7 +1359,7 @@ int sd_dhcp_lease_get_timezone(const sd_dhcp_lease *lease, const char **tz) {
return 0;
}
-int sd_dhcp_route_get_destination(const sd_dhcp_route *route, struct in_addr *destination) {
+int sd_dhcp_route_get_destination(sd_dhcp_route *route, struct in_addr *destination) {
assert_return(route, -EINVAL);
assert_return(destination, -EINVAL);
@@ -1367,7 +1367,7 @@ int sd_dhcp_route_get_destination(const sd_dhcp_route *route, struct in_addr *de
return 0;
}
-int sd_dhcp_route_get_destination_prefix_length(const sd_dhcp_route *route, uint8_t *length) {
+int sd_dhcp_route_get_destination_prefix_length(sd_dhcp_route *route, uint8_t *length) {
assert_return(route, -EINVAL);
assert_return(length, -EINVAL);
@@ -1375,7 +1375,7 @@ int sd_dhcp_route_get_destination_prefix_length(const sd_dhcp_route *route, uint
return 0;
}
-int sd_dhcp_route_get_gateway(const sd_dhcp_route *route, struct in_addr *gateway) {
+int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway) {
assert_return(route, -EINVAL);
assert_return(gateway, -EINVAL);
@@ -1383,7 +1383,7 @@ int sd_dhcp_route_get_gateway(const sd_dhcp_route *route, struct in_addr *gatewa
return 0;
}
-int sd_dhcp_route_get_option(const sd_dhcp_route *route) {
+int sd_dhcp_route_get_option(sd_dhcp_route *route) {
assert_return(route, -EINVAL);
return route->option;
diff --git a/src/libsystemd/sd-netlink/generic-netlink.c b/src/libsystemd/sd-netlink/generic-netlink.c
index a939d65569..3d1ee585c7 100644
--- a/src/libsystemd/sd-netlink/generic-netlink.c
+++ b/src/libsystemd/sd-netlink/generic-netlink.c
@@ -152,7 +152,7 @@ int nlmsg_type_to_genl_family(const sd_netlink *nl, uint16_t type, sd_genl_famil
return 0;
}
-int sd_genl_message_get_family(const sd_netlink *nl, const sd_netlink_message *m, sd_genl_family_t *family) {
+int sd_genl_message_get_family(sd_netlink *nl, sd_netlink_message *m, sd_genl_family_t *family) {
uint16_t type;
int r;
diff --git a/src/libsystemd/sd-netlink/netlink-message.c b/src/libsystemd/sd-netlink/netlink-message.c
index 90915fd155..d7bc1ce14d 100644
--- a/src/libsystemd/sd-netlink/netlink-message.c
+++ b/src/libsystemd/sd-netlink/netlink-message.c
@@ -114,7 +114,7 @@ sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m) {
return NULL;
}
-int sd_netlink_message_get_type(const sd_netlink_message *m, uint16_t *type) {
+int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type) {
assert_return(m, -EINVAL);
assert_return(type, -EINVAL);
@@ -132,7 +132,7 @@ int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags) {
return 0;
}
-int sd_netlink_message_is_broadcast(const sd_netlink_message *m) {
+int sd_netlink_message_is_broadcast(sd_netlink_message *m) {
assert_return(m, -EINVAL);
return m->broadcast;
@@ -1235,14 +1235,14 @@ uint32_t rtnl_message_get_serial(sd_netlink_message *m) {
return m->hdr->nlmsg_seq;
}
-int sd_netlink_message_is_error(const sd_netlink_message *m) {
+int sd_netlink_message_is_error(sd_netlink_message *m) {
assert_return(m, 0);
assert_return(m->hdr, 0);
return m->hdr->nlmsg_type == NLMSG_ERROR;
}
-int sd_netlink_message_get_errno(const sd_netlink_message *m) {
+int sd_netlink_message_get_errno(sd_netlink_message *m) {
struct nlmsgerr *err;
assert_return(m, -EINVAL);
diff --git a/src/libsystemd/sd-netlink/netlink-slot.c b/src/libsystemd/sd-netlink/netlink-slot.c
index fa951bf941..b6de545fe2 100644
--- a/src/libsystemd/sd-netlink/netlink-slot.c
+++ b/src/libsystemd/sd-netlink/netlink-slot.c
@@ -142,7 +142,7 @@ void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata) {
return ret;
}
-int sd_netlink_slot_get_destroy_callback(const sd_netlink_slot *slot, sd_netlink_destroy_t *callback) {
+int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *callback) {
assert_return(slot, -EINVAL);
if (callback)
@@ -158,7 +158,7 @@ int sd_netlink_slot_set_destroy_callback(sd_netlink_slot *slot, sd_netlink_destr
return 0;
}
-int sd_netlink_slot_get_floating(const sd_netlink_slot *slot) {
+int sd_netlink_slot_get_floating(sd_netlink_slot *slot) {
assert_return(slot, -EINVAL);
return slot->floating;
@@ -186,7 +186,7 @@ int sd_netlink_slot_set_floating(sd_netlink_slot *slot, int b) {
return 1;
}
-int sd_netlink_slot_get_description(const sd_netlink_slot *slot, const char **description) {
+int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **description) {
assert_return(slot, -EINVAL);
if (description)
diff --git a/src/libsystemd/sd-netlink/rtnl-message.c b/src/libsystemd/sd-netlink/rtnl-message.c
index ead1967258..6b4c213e1e 100644
--- a/src/libsystemd/sd-netlink/rtnl-message.c
+++ b/src/libsystemd/sd-netlink/rtnl-message.c
@@ -81,7 +81,7 @@ int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags) {
return 0;
}
-int sd_rtnl_message_route_get_flags(const sd_netlink_message *m, unsigned *flags) {
+int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -110,7 +110,7 @@ int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table)
return 0;
}
-int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family) {
+int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -125,7 +125,7 @@ int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family) {
return 0;
}
-int sd_rtnl_message_route_get_type(const sd_netlink_message *m, unsigned char *type) {
+int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -154,7 +154,7 @@ int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type) {
return 0;
}
-int sd_rtnl_message_route_get_protocol(const sd_netlink_message *m, unsigned char *protocol) {
+int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -169,7 +169,7 @@ int sd_rtnl_message_route_get_protocol(const sd_netlink_message *m, unsigned cha
return 0;
}
-int sd_rtnl_message_route_get_scope(const sd_netlink_message *m, unsigned char *scope) {
+int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -184,7 +184,7 @@ int sd_rtnl_message_route_get_scope(const sd_netlink_message *m, unsigned char *
return 0;
}
-int sd_rtnl_message_route_get_tos(const sd_netlink_message *m, uint8_t *tos) {
+int sd_rtnl_message_route_get_tos(sd_netlink_message *m, uint8_t *tos) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -199,7 +199,7 @@ int sd_rtnl_message_route_get_tos(const sd_netlink_message *m, uint8_t *tos) {
return 0;
}
-int sd_rtnl_message_route_get_table(const sd_netlink_message *m, unsigned char *table) {
+int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -214,7 +214,7 @@ int sd_rtnl_message_route_get_table(const sd_netlink_message *m, unsigned char *
return 0;
}
-int sd_rtnl_message_route_get_dst_prefixlen(const sd_netlink_message *m, unsigned char *dst_len) {
+int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -229,7 +229,7 @@ int sd_rtnl_message_route_get_dst_prefixlen(const sd_netlink_message *m, unsigne
return 0;
}
-int sd_rtnl_message_route_get_src_prefixlen(const sd_netlink_message *m, unsigned char *src_len) {
+int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len) {
struct rtmsg *rtm;
assert_return(m, -EINVAL);
@@ -324,7 +324,7 @@ int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags) {
return 0;
}
-int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *family) {
+int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family) {
struct nhmsg *nhm;
assert_return(m, -EINVAL);
@@ -338,7 +338,7 @@ int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *fam
return 0;
}
-int sd_rtnl_message_nexthop_get_protocol(const sd_netlink_message *m, uint8_t *protocol) {
+int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protocol) {
struct nhmsg *nhm;
assert_return(m, -EINVAL);
@@ -378,7 +378,7 @@ int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state) {
return 0;
}
-int sd_rtnl_message_neigh_get_flags(const sd_netlink_message *m, uint8_t *flags) {
+int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags) {
struct ndmsg *ndm;
assert_return(m, -EINVAL);
@@ -391,7 +391,7 @@ int sd_rtnl_message_neigh_get_flags(const sd_netlink_message *m, uint8_t *flags)
return 0;
}
-int sd_rtnl_message_neigh_get_state(const sd_netlink_message *m, uint16_t *state) {
+int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state) {
struct ndmsg *ndm;
assert_return(m, -EINVAL);
@@ -404,7 +404,7 @@ int sd_rtnl_message_neigh_get_state(const sd_netlink_message *m, uint16_t *state
return 0;
}
-int sd_rtnl_message_neigh_get_family(const sd_netlink_message *m, int *family) {
+int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family) {
struct ndmsg *ndm;
assert_return(m, -EINVAL);
@@ -419,7 +419,7 @@ int sd_rtnl_message_neigh_get_family(const sd_netlink_message *m, int *family) {
return 0;
}
-int sd_rtnl_message_neigh_get_ifindex(const sd_netlink_message *m, int *index) {
+int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index) {
struct ndmsg *ndm;
assert_return(m, -EINVAL);
@@ -572,7 +572,7 @@ int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope) {
return 0;
}
-int sd_rtnl_message_addr_get_family(const sd_netlink_message *m, int *family) {
+int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family) {
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
@@ -587,7 +587,7 @@ int sd_rtnl_message_addr_get_family(const sd_netlink_message *m, int *family) {
return 0;
}
-int sd_rtnl_message_addr_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen) {
+int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) {
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
@@ -602,7 +602,7 @@ int sd_rtnl_message_addr_get_prefixlen(const sd_netlink_message *m, unsigned cha
return 0;
}
-int sd_rtnl_message_addr_get_scope(const sd_netlink_message *m, unsigned char *scope) {
+int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope) {
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
@@ -617,7 +617,7 @@ int sd_rtnl_message_addr_get_scope(const sd_netlink_message *m, unsigned char *s
return 0;
}
-int sd_rtnl_message_addr_get_flags(const sd_netlink_message *m, unsigned char *flags) {
+int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags) {
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
@@ -632,7 +632,7 @@ int sd_rtnl_message_addr_get_flags(const sd_netlink_message *m, unsigned char *f
return 0;
}
-int sd_rtnl_message_addr_get_ifindex(const sd_netlink_message *m, int *ifindex) {
+int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex) {
struct ifaddrmsg *ifa;
assert_return(m, -EINVAL);
@@ -692,7 +692,7 @@ int sd_rtnl_message_new_addr_update(sd_netlink *rtnl, sd_netlink_message **ret,
return 0;
}
-int sd_rtnl_message_link_get_ifindex(const sd_netlink_message *m, int *ifindex) {
+int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex) {
struct ifinfomsg *ifi;
assert_return(m, -EINVAL);
@@ -707,7 +707,7 @@ int sd_rtnl_message_link_get_ifindex(const sd_netlink_message *m, int *ifindex)
return 0;
}
-int sd_rtnl_message_link_get_flags(const sd_netlink_message *m, unsigned *flags) {
+int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags) {
struct ifinfomsg *ifi;
assert_return(m, -EINVAL);
@@ -722,7 +722,7 @@ int sd_rtnl_message_link_get_flags(const sd_netlink_message *m, unsigned *flags)
return 0;
}
-int sd_rtnl_message_link_get_type(const sd_netlink_message *m, unsigned short *type) {
+int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type) {
struct ifinfomsg *ifi;
assert_return(m, -EINVAL);
@@ -737,7 +737,7 @@ int sd_rtnl_message_link_get_type(const sd_netlink_message *m, unsigned short *t
return 0;
}
-int sd_rtnl_message_get_family(const sd_netlink_message *m, int *family) {
+int sd_rtnl_message_get_family(sd_netlink_message *m, int *family) {
assert_return(m, -EINVAL);
assert_return(family, -EINVAL);
@@ -835,7 +835,7 @@ int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char
return 0;
}
-int sd_rtnl_message_addrlabel_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen) {
+int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen) {
struct ifaddrlblmsg *addrlabel;
assert_return(m, -EINVAL);
@@ -884,7 +884,7 @@ int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t t
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_tos(const sd_netlink_message *m, uint8_t *tos) {
+int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *tos) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
@@ -912,7 +912,7 @@ int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_table(const sd_netlink_message *m, uint8_t *table) {
+int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *table) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
@@ -939,7 +939,7 @@ int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_flags(const sd_netlink_message *m, uint32_t *flags) {
+int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
@@ -966,7 +966,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_fib_type(const sd_netlink_message *m, uint8_t *type) {
+int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint8_t *type) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
@@ -994,7 +994,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(const sd_netlink_message *m, uint8_t *len) {
+int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message *m, uint8_t *len) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
@@ -1022,7 +1022,7 @@ int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message
return 0;
}
-int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(const sd_netlink_message *m, uint8_t *len) {
+int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message *m, uint8_t *len) {
struct fib_rule_hdr *frh;
assert_return(m, -EINVAL);
diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c
index f862d48253..a003c25719 100644
--- a/src/libsystemd/sd-netlink/sd-netlink.c
+++ b/src/libsystemd/sd-netlink/sd-netlink.c
@@ -742,7 +742,7 @@ int sd_netlink_call(sd_netlink *rtnl,
return sd_netlink_read(rtnl, serial, usec, ret);
}
-int sd_netlink_get_events(const sd_netlink *rtnl) {
+int sd_netlink_get_events(sd_netlink *rtnl) {
assert_return(rtnl, -EINVAL);
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
@@ -752,7 +752,7 @@ int sd_netlink_get_events(const sd_netlink *rtnl) {
return 0;
}
-int sd_netlink_get_timeout(const sd_netlink *rtnl, uint64_t *timeout_usec) {
+int sd_netlink_get_timeout(sd_netlink *rtnl, uint64_t *timeout_usec) {
struct reply_callback *c;
assert_return(rtnl, -EINVAL);
diff --git a/src/partition/repart.c b/src/partition/repart.c
index 51b8f20dbc..1ecd9ffea4 100644
--- a/src/partition/repart.c
+++ b/src/partition/repart.c
@@ -977,7 +977,7 @@ static int config_parse_label(
/* Nota bene: the empty label is a totally valid one. Let's hence not follow our usual rule of
* assigning the empty string to reset to default here, but really accept it as label to set. */
- r = specifier_printf(rvalue, specifier_table, NULL, &resolved);
+ r = specifier_printf(rvalue, GPT_LABEL_MAX, specifier_table, NULL, &resolved);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in Label=, ignoring: %s", rvalue);
@@ -1142,7 +1142,7 @@ static int config_parse_copy_files(
if (!isempty(p))
return log_syntax(unit, LOG_ERR, filename, line, SYNTHETIC_ERRNO(EINVAL), "Too many arguments: %s", rvalue);
- r = specifier_printf(source, specifier_table, NULL, &resolved_source);
+ r = specifier_printf(source, PATH_MAX-1, specifier_table, NULL, &resolved_source);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in CopyFiles= source, ignoring: %s", rvalue);
@@ -1153,7 +1153,7 @@ static int config_parse_copy_files(
if (r < 0)
return 0;
- r = specifier_printf(target, specifier_table, NULL, &resolved_target);
+ r = specifier_printf(target, PATH_MAX-1, specifier_table, NULL, &resolved_target);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in CopyFiles= target, ignoring: %s", resolved_target);
@@ -1202,7 +1202,7 @@ static int config_parse_copy_blocks(
return 0;
}
- r = specifier_printf(rvalue, specifier_table, NULL, &d);
+ r = specifier_printf(rvalue, PATH_MAX-1, specifier_table, NULL, &d);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in CopyBlocks= source path, ignoring: %s", rvalue);
@@ -1250,7 +1250,7 @@ static int config_parse_make_dirs(
if (r == 0)
return 0;
- r = specifier_printf(word, specifier_table, NULL, &d);
+ r = specifier_printf(word, PATH_MAX-1, specifier_table, NULL, &d);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Failed to expand specifiers in MakeDirectories= parameter, ignoring: %s", word);
diff --git a/src/resolve/resolved-conf.c b/src/resolve/resolved-conf.c
index 87d1794a74..9b7f7f9ba2 100644
--- a/src/resolve/resolved-conf.c
+++ b/src/resolve/resolved-conf.c
@@ -255,7 +255,7 @@ int config_parse_dnssd_service_name(
return 0;
}
- r = specifier_printf(rvalue, specifier_table, NULL, &name);
+ r = specifier_printf(rvalue, DNS_LABEL_MAX, specifier_table, NULL, &name);
if (r < 0) {
log_syntax(unit, LOG_WARNING, filename, line, r,
"Invalid service instance name template '%s', ignoring assignment: %m", rvalue);
diff --git a/src/resolve/resolved-dnssd.c b/src/resolve/resolved-dnssd.c
index aed9c5c1cd..1c7f16c4d2 100644
--- a/src/resolve/resolved-dnssd.c
+++ b/src/resolve/resolved-dnssd.c
@@ -170,7 +170,7 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
assert(s);
assert(s->name_template);
- r = specifier_printf(s->name_template, specifier_table, s, &name);
+ r = specifier_printf(s->name_template, DNS_LABEL_MAX, specifier_table, s, &name);
if (r < 0)
return log_debug_errno(r, "Failed to replace specifiers: %m");
diff --git a/src/shared/dns-domain.c b/src/shared/dns-domain.c
index e43aa12882..ec3021d602 100644
--- a/src/shared/dns-domain.c
+++ b/src/shared/dns-domain.c
@@ -985,7 +985,7 @@ bool dns_service_name_is_valid(const char *name) {
l = strlen(name);
if (l <= 0)
return false;
- if (l > 63)
+ if (l > DNS_LABEL_MAX)
return false;
return true;
diff --git a/src/shared/gpt.c b/src/shared/gpt.c
index 558b69c487..bd1f43ffdd 100644
--- a/src/shared/gpt.c
+++ b/src/shared/gpt.c
@@ -104,7 +104,7 @@ int gpt_partition_label_valid(const char *s) {
if (!recoded)
return -ENOMEM;
- return char16_strlen(recoded) <= 36;
+ return char16_strlen(recoded) <= GPT_LABEL_MAX;
}
bool gpt_partition_type_is_root(sd_id128_t id) {
diff --git a/src/shared/gpt.h b/src/shared/gpt.h
index 6581973793..c92d9c0974 100644
--- a/src/shared/gpt.h
+++ b/src/shared/gpt.h
@@ -115,6 +115,9 @@
#define GPT_FLAG_NO_AUTO (1ULL << 63)
#define GPT_FLAG_GROWFS (1ULL << 59)
+/* maximum length of gpt label */
+#define GPT_LABEL_MAX 36
+
const char *gpt_partition_type_uuid_to_string(sd_id128_t id);
const char *gpt_partition_type_uuid_to_string_harder(
sd_id128_t id,
diff --git a/src/shared/install-printf.c b/src/shared/install-printf.c
index 6bc3f15def..a697b5c4e7 100644
--- a/src/shared/install-printf.c
+++ b/src/shared/install-printf.c
@@ -103,7 +103,7 @@ static int specifier_last_component(char specifier, const void *data, const void
return 0;
}
-int install_full_printf(const UnitFileInstallInfo *i, const char *format, char **ret) {
+int install_full_printf_internal(const UnitFileInstallInfo *i, const char *format, size_t max_length, char **ret) {
/* This is similar to unit_name_printf() */
const Specifier table[] = {
@@ -123,5 +123,5 @@ int install_full_printf(const UnitFileInstallInfo *i, const char *format, char *
assert(format);
assert(ret);
- return specifier_printf(format, table, i, ret);
+ return specifier_printf(format, max_length, table, i, ret);
}
diff --git a/src/shared/install-printf.h b/src/shared/install-printf.h
index 34e129413e..13a39829e9 100644
--- a/src/shared/install-printf.h
+++ b/src/shared/install-printf.h
@@ -2,5 +2,12 @@
#pragma once
#include "install.h"
+#include "unit-name.h"
-int install_full_printf(const UnitFileInstallInfo *i, const char *format, char **ret);
+int install_full_printf_internal(const UnitFileInstallInfo *i, const char *format, size_t max_length, char **ret);
+static inline int install_name_printf(const UnitFileInstallInfo *i, const char *format, char **ret) {
+ return install_full_printf_internal(i, format, UNIT_NAME_MAX, ret);
+}
+static inline int install_path_printf(const UnitFileInstallInfo *i, const char *format, char **ret) {
+ return install_full_printf_internal(i, format, PATH_MAX-1, ret);
+}
diff --git a/src/shared/install.c b/src/shared/install.c
index 3e9f6a3df3..407de0af5e 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1143,7 +1143,7 @@ static int config_parse_also(
if (r == 0)
break;
- r = install_full_printf(info, word, &printed);
+ r = install_name_printf(info, word, &printed);
if (r < 0)
return r;
@@ -1190,7 +1190,7 @@ static int config_parse_default_instance(
return log_syntax(unit, LOG_WARNING, filename, line, 0,
"DefaultInstance= only makes sense for template units, ignoring.");
- r = install_full_printf(i, rvalue, &printed);
+ r = install_name_printf(i, rvalue, &printed);
if (r < 0)
return r;
@@ -1816,7 +1816,7 @@ static int install_info_symlink_alias(
STRV_FOREACH(s, i->aliases) {
_cleanup_free_ char *alias_path = NULL, *dst = NULL, *dst_updated = NULL;
- q = install_full_printf(i, *s, &dst);
+ q = install_path_printf(i, *s, &dst);
if (q < 0)
return q;
@@ -1891,7 +1891,7 @@ static int install_info_symlink_wants(
STRV_FOREACH(s, list) {
_cleanup_free_ char *path = NULL, *dst = NULL;
- q = install_full_printf(i, *s, &dst);
+ q = install_name_printf(i, *s, &dst);
if (q < 0)
return q;
diff --git a/src/shared/specifier.c b/src/shared/specifier.c
index 6edf4a215c..ef164b3942 100644
--- a/src/shared/specifier.c
+++ b/src/shared/specifier.c
@@ -29,9 +29,9 @@
* and "%" used for escaping. */
#define POSSIBLE_SPECIFIERS ALPHANUMERICAL "%"
-int specifier_printf(const char *text, const Specifier table[], const void *userdata, char **_ret) {
+int specifier_printf(const char *text, size_t max_length, const Specifier table[], const void *userdata, char **ret) {
size_t l, allocated = 0;
- _cleanup_free_ char *ret = NULL;
+ _cleanup_free_ char *result = NULL;
char *t;
const char *f;
bool percent = false;
@@ -41,11 +41,11 @@ int specifier_printf(const char *text, const Specifier table[], const void *user
assert(table);
l = strlen(text);
- if (!GREEDY_REALLOC(ret, allocated, l + 1))
+ if (!GREEDY_REALLOC(result, allocated, l + 1))
return -ENOMEM;
- t = ret;
+ t = result;
- for (f = text; *f; f++, l--)
+ for (f = text; *f != '\0'; f++, l--) {
if (percent) {
if (*f == '%')
*(t++) = '%';
@@ -64,13 +64,13 @@ int specifier_printf(const char *text, const Specifier table[], const void *user
if (r < 0)
return r;
- j = t - ret;
+ j = t - result;
k = strlen(w);
- if (!GREEDY_REALLOC(ret, allocated, j + k + l + 1))
+ if (!GREEDY_REALLOC(result, allocated, j + k + l + 1))
return -ENOMEM;
- memcpy(ret + j, w, k);
- t = ret + j + k;
+ memcpy(result + j, w, k);
+ t = result + j + k;
} else if (strchr(POSSIBLE_SPECIFIERS, *f))
/* Oops, an unknown specifier. */
return -EBADSLT;
@@ -86,19 +86,26 @@ int specifier_printf(const char *text, const Specifier table[], const void *user
else
*(t++) = *f;
+ if ((size_t) (t - result) > max_length)
+ return -ENAMETOOLONG;
+ }
+
/* If string ended with a stray %, also end with % */
- if (percent)
+ if (percent) {
*(t++) = '%';
+ if ((size_t) (t - result) > max_length)
+ return -ENAMETOOLONG;
+ }
*(t++) = 0;
/* Try to deallocate unused bytes, but don't sweat it too much */
- if ((size_t)(t - ret) < allocated) {
- t = realloc(ret, t - ret);
+ if ((size_t)(t - result) < allocated) {
+ t = realloc(result, t - result);
if (t)
- ret = t;
+ result = t;
}
- *_ret = TAKE_PTR(ret);
+ *ret = TAKE_PTR(result);
return 0;
}
@@ -124,7 +131,7 @@ int specifier_machine_id(char specifier, const void *data, const void *userdata,
if (r < 0)
return r;
- n = new(char, 33);
+ n = new(char, SD_ID128_STRING_MAX);
if (!n)
return -ENOMEM;
@@ -141,7 +148,7 @@ int specifier_boot_id(char specifier, const void *data, const void *userdata, ch
if (r < 0)
return r;
- n = new(char, 33);
+ n = new(char, SD_ID128_STRING_MAX);
if (!n)
return -ENOMEM;
diff --git a/src/shared/specifier.h b/src/shared/specifier.h
index 6735a7a363..0c5bb3d0c4 100644
--- a/src/shared/specifier.h
+++ b/src/shared/specifier.h
@@ -11,7 +11,7 @@ typedef struct Specifier {
const void *data;
} Specifier;
-int specifier_printf(const char *text, const Specifier table[], const void *userdata, char **ret);
+int specifier_printf(const char *text, size_t max_length, const Specifier table[], const void *userdata, char **ret);
int specifier_string(char specifier, const void *data, const void *userdata, char **ret);
diff --git a/src/systemd/sd-dhcp-client.h b/src/systemd/sd-dhcp-client.h
index 0877a6b9a9..5300234098 100644
--- a/src/systemd/sd-dhcp-client.h
+++ b/src/systemd/sd-dhcp-client.h
@@ -206,7 +206,7 @@ int sd_dhcp_client_set_fallback_lease_lifetime(
int sd_dhcp_client_add_option(sd_dhcp_client *client, sd_dhcp_option *v);
int sd_dhcp_client_add_vendor_option(sd_dhcp_client *client, sd_dhcp_option *v);
-int sd_dhcp_client_is_running(const sd_dhcp_client *client);
+int sd_dhcp_client_is_running(sd_dhcp_client *client);
int sd_dhcp_client_stop(sd_dhcp_client *client);
int sd_dhcp_client_start(sd_dhcp_client *client);
int sd_dhcp_client_send_release(sd_dhcp_client *client);
diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h
index 9cf36d896b..5abf9a406c 100644
--- a/src/systemd/sd-dhcp-lease.h
+++ b/src/systemd/sd-dhcp-lease.h
@@ -46,36 +46,36 @@ typedef enum sd_dhcp_lease_server_type_t {
_SD_ENUM_FORCE_S64(DHCP_LEASE_SERVER_TYPE),
} sd_dhcp_lease_server_type_t;
-int sd_dhcp_lease_get_address(const sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_lifetime(const sd_dhcp_lease *lease, uint32_t *lifetime);
-int sd_dhcp_lease_get_t1(const sd_dhcp_lease *lease, uint32_t *t1);
-int sd_dhcp_lease_get_t2(const sd_dhcp_lease *lease, uint32_t *t2);
-int sd_dhcp_lease_get_broadcast(const sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_netmask(const sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_router(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_next_server(const sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_server_identifier(const sd_dhcp_lease *lease, struct in_addr *addr);
-int sd_dhcp_lease_get_servers(const sd_dhcp_lease *lease, sd_dhcp_lease_server_type_t what, const struct in_addr **addr);
-int sd_dhcp_lease_get_dns(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_ntp(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_sip(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_pop3(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_smtp(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_lpr(const sd_dhcp_lease *lease, const struct in_addr **addr);
-int sd_dhcp_lease_get_mtu(const sd_dhcp_lease *lease, uint16_t *mtu);
-int sd_dhcp_lease_get_domainname(const sd_dhcp_lease *lease, const char **domainname);
-int sd_dhcp_lease_get_search_domains(const sd_dhcp_lease *lease, char ***domains);
-int sd_dhcp_lease_get_hostname(const sd_dhcp_lease *lease, const char **hostname);
-int sd_dhcp_lease_get_root_path(const sd_dhcp_lease *lease, const char **root_path);
-int sd_dhcp_lease_get_routes(const sd_dhcp_lease *lease, sd_dhcp_route ***routes);
-int sd_dhcp_lease_get_vendor_specific(const sd_dhcp_lease *lease, const void **data, size_t *data_len);
-int sd_dhcp_lease_get_client_id(const sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len);
-int sd_dhcp_lease_get_timezone(const sd_dhcp_lease *lease, const char **timezone);
+int sd_dhcp_lease_get_address(sd_dhcp_lease *lease, struct in_addr *addr);
+int sd_dhcp_lease_get_lifetime(sd_dhcp_lease *lease, uint32_t *lifetime);
+int sd_dhcp_lease_get_t1(sd_dhcp_lease *lease, uint32_t *t1);
+int sd_dhcp_lease_get_t2(sd_dhcp_lease *lease, uint32_t *t2);
+int sd_dhcp_lease_get_broadcast(sd_dhcp_lease *lease, struct in_addr *addr);
+int sd_dhcp_lease_get_netmask(sd_dhcp_lease *lease, struct in_addr *addr);
+int sd_dhcp_lease_get_router(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_next_server(sd_dhcp_lease *lease, struct in_addr *addr);
+int sd_dhcp_lease_get_server_identifier(sd_dhcp_lease *lease, struct in_addr *addr);
+int sd_dhcp_lease_get_servers(sd_dhcp_lease *lease, sd_dhcp_lease_server_type_t what, const struct in_addr **addr);
+int sd_dhcp_lease_get_dns(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_ntp(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_sip(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_pop3(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_smtp(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_lpr(sd_dhcp_lease *lease, const struct in_addr **addr);
+int sd_dhcp_lease_get_mtu(sd_dhcp_lease *lease, uint16_t *mtu);
+int sd_dhcp_lease_get_domainname(sd_dhcp_lease *lease, const char **domainname);
+int sd_dhcp_lease_get_search_domains(sd_dhcp_lease *lease, char ***domains);
+int sd_dhcp_lease_get_hostname(sd_dhcp_lease *lease, const char **hostname);
+int sd_dhcp_lease_get_root_path(sd_dhcp_lease *lease, const char **root_path);
+int sd_dhcp_lease_get_routes(sd_dhcp_lease *lease, sd_dhcp_route ***routes);
+int sd_dhcp_lease_get_vendor_specific(sd_dhcp_lease *lease, const void **data, size_t *data_len);
+int sd_dhcp_lease_get_client_id(sd_dhcp_lease *lease, const void **client_id, size_t *client_id_len);
+int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **timezone);
-int sd_dhcp_route_get_destination(const sd_dhcp_route *route, struct in_addr *destination);
-int sd_dhcp_route_get_destination_prefix_length(const sd_dhcp_route *route, uint8_t *length);
-int sd_dhcp_route_get_gateway(const sd_dhcp_route *route, struct in_addr *gateway);
-int sd_dhcp_route_get_option(const sd_dhcp_route *route);
+int sd_dhcp_route_get_destination(sd_dhcp_route *route, struct in_addr *destination);
+int sd_dhcp_route_get_destination_prefix_length(sd_dhcp_route *route, uint8_t *length);
+int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway);
+int sd_dhcp_route_get_option(sd_dhcp_route *route);
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_lease, sd_dhcp_lease_unref);
diff --git a/src/systemd/sd-netlink.h b/src/systemd/sd-netlink.h
index bc572f9b84..fb406169de 100644
--- a/src/systemd/sd-netlink.h
+++ b/src/systemd/sd-netlink.h
@@ -73,8 +73,8 @@ int sd_netlink_call(sd_netlink *nl, sd_netlink_message *message, uint64_t timeou
sd_netlink_message **reply);
int sd_netlink_read(sd_netlink *nl, uint32_t serial, uint64_t timeout, sd_netlink_message **reply);
-int sd_netlink_get_events(const sd_netlink *nl);
-int sd_netlink_get_timeout(const sd_netlink *nl, uint64_t *timeout);
+int sd_netlink_get_events(sd_netlink *nl);
+int sd_netlink_get_timeout(sd_netlink *nl, uint64_t *timeout);
int sd_netlink_process(sd_netlink *nl, sd_netlink_message **ret);
int sd_netlink_wait(sd_netlink *nl, uint64_t timeout);
@@ -137,33 +137,33 @@ sd_netlink_message *sd_netlink_message_ref(sd_netlink_message *m);
sd_netlink_message *sd_netlink_message_unref(sd_netlink_message *m);
int sd_netlink_message_request_dump(sd_netlink_message *m, int dump);
-int sd_netlink_message_is_error(const sd_netlink_message *m);
-int sd_netlink_message_get_errno(const sd_netlink_message *m);
-int sd_netlink_message_get_type(const sd_netlink_message *m, uint16_t *type);
+int sd_netlink_message_is_error(sd_netlink_message *m);
+int sd_netlink_message_get_errno(sd_netlink_message *m);
+int sd_netlink_message_get_type(sd_netlink_message *m, uint16_t *type);
int sd_netlink_message_set_flags(sd_netlink_message *m, uint16_t flags);
-int sd_netlink_message_is_broadcast(const sd_netlink_message *m);
+int sd_netlink_message_is_broadcast(sd_netlink_message *m);
/* rtnl */
-int sd_rtnl_message_get_family(const sd_netlink_message *m, int *family);
+int sd_rtnl_message_get_family(sd_netlink_message *m, int *family);
int sd_rtnl_message_new_addr(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int family);
int sd_rtnl_message_new_addr_update(sd_netlink *nl, sd_netlink_message **ret, int index, int family);
int sd_rtnl_message_addr_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
int sd_rtnl_message_addr_set_scope(sd_netlink_message *m, unsigned char scope);
int sd_rtnl_message_addr_set_flags(sd_netlink_message *m, unsigned char flags);
-int sd_rtnl_message_addr_get_family(const sd_netlink_message *m, int *family);
-int sd_rtnl_message_addr_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen);
-int sd_rtnl_message_addr_get_scope(const sd_netlink_message *m, unsigned char *scope);
-int sd_rtnl_message_addr_get_flags(const sd_netlink_message *m, unsigned char *flags);
-int sd_rtnl_message_addr_get_ifindex(const sd_netlink_message *m, int *ifindex);
+int sd_rtnl_message_addr_get_family(sd_netlink_message *m, int *family);
+int sd_rtnl_message_addr_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
+int sd_rtnl_message_addr_get_scope(sd_netlink_message *m, unsigned char *scope);
+int sd_rtnl_message_addr_get_flags(sd_netlink_message *m, unsigned char *flags);
+int sd_rtnl_message_addr_get_ifindex(sd_netlink_message *m, int *ifindex);
int sd_rtnl_message_new_link(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index);
int sd_rtnl_message_link_set_flags(sd_netlink_message *m, unsigned flags, unsigned change);
int sd_rtnl_message_link_set_type(sd_netlink_message *m, unsigned type);
int sd_rtnl_message_link_set_family(sd_netlink_message *m, unsigned family);
-int sd_rtnl_message_link_get_ifindex(const sd_netlink_message *m, int *ifindex);
-int sd_rtnl_message_link_get_flags(const sd_netlink_message *m, unsigned *flags);
-int sd_rtnl_message_link_get_type(const sd_netlink_message *m, unsigned short *type);
+int sd_rtnl_message_link_get_ifindex(sd_netlink_message *m, int *ifindex);
+int sd_rtnl_message_link_get_flags(sd_netlink_message *m, unsigned *flags);
+int sd_rtnl_message_link_get_type(sd_netlink_message *m, unsigned short *type);
int sd_rtnl_message_new_route(sd_netlink *nl, sd_netlink_message **ret, uint16_t nlmsg_type, int rtm_family, unsigned char rtm_protocol);
int sd_rtnl_message_route_set_dst_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
@@ -172,46 +172,46 @@ int sd_rtnl_message_route_set_scope(sd_netlink_message *m, unsigned char scope);
int sd_rtnl_message_route_set_flags(sd_netlink_message *m, unsigned flags);
int sd_rtnl_message_route_set_table(sd_netlink_message *m, unsigned char table);
int sd_rtnl_message_route_set_type(sd_netlink_message *m, unsigned char type);
-int sd_rtnl_message_route_get_flags(const sd_netlink_message *m, unsigned *flags);
-int sd_rtnl_message_route_get_family(const sd_netlink_message *m, int *family);
-int sd_rtnl_message_route_get_protocol(const sd_netlink_message *m, unsigned char *protocol);
-int sd_rtnl_message_route_get_scope(const sd_netlink_message *m, unsigned char *scope);
-int sd_rtnl_message_route_get_tos(const sd_netlink_message *m, unsigned char *tos);
-int sd_rtnl_message_route_get_table(const sd_netlink_message *m, unsigned char *table);
-int sd_rtnl_message_route_get_dst_prefixlen(const sd_netlink_message *m, unsigned char *dst_len);
-int sd_rtnl_message_route_get_src_prefixlen(const sd_netlink_message *m, unsigned char *src_len);
-int sd_rtnl_message_route_get_type(const sd_netlink_message *m, unsigned char *type);
+int sd_rtnl_message_route_get_flags(sd_netlink_message *m, unsigned *flags);
+int sd_rtnl_message_route_get_family(sd_netlink_message *m, int *family);
+int sd_rtnl_message_route_get_protocol(sd_netlink_message *m, unsigned char *protocol);
+int sd_rtnl_message_route_get_scope(sd_netlink_message *m, unsigned char *scope);
+int sd_rtnl_message_route_get_tos(sd_netlink_message *m, unsigned char *tos);
+int sd_rtnl_message_route_get_table(sd_netlink_message *m, unsigned char *table);
+int sd_rtnl_message_route_get_dst_prefixlen(sd_netlink_message *m, unsigned char *dst_len);
+int sd_rtnl_message_route_get_src_prefixlen(sd_netlink_message *m, unsigned char *src_len);
+int sd_rtnl_message_route_get_type(sd_netlink_message *m, unsigned char *type);
int sd_rtnl_message_new_nexthop(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nhmsg_type, int nh_family, unsigned char nh_protocol);
int sd_rtnl_message_nexthop_set_flags(sd_netlink_message *m, uint8_t flags);
-int sd_rtnl_message_nexthop_get_family(const sd_netlink_message *m, uint8_t *family);
-int sd_rtnl_message_nexthop_get_protocol(const sd_netlink_message *m, uint8_t *protocol);
+int sd_rtnl_message_nexthop_get_family(sd_netlink_message *m, uint8_t *family);
+int sd_rtnl_message_nexthop_get_protocol(sd_netlink_message *m, uint8_t *protocol);
int sd_rtnl_message_new_neigh(sd_netlink *nl, sd_netlink_message **ret, uint16_t msg_type, int index, int nda_family);
int sd_rtnl_message_neigh_set_flags(sd_netlink_message *m, uint8_t flags);
int sd_rtnl_message_neigh_set_state(sd_netlink_message *m, uint16_t state);
-int sd_rtnl_message_neigh_get_family(const sd_netlink_message *m, int *family);
-int sd_rtnl_message_neigh_get_ifindex(const sd_netlink_message *m, int *index);
-int sd_rtnl_message_neigh_get_state(const sd_netlink_message *m, uint16_t *state);
-int sd_rtnl_message_neigh_get_flags(const sd_netlink_message *m, uint8_t *flags);
+int sd_rtnl_message_neigh_get_family(sd_netlink_message *m, int *family);
+int sd_rtnl_message_neigh_get_ifindex(sd_netlink_message *m, int *index);
+int sd_rtnl_message_neigh_get_state(sd_netlink_message *m, uint16_t *state);
+int sd_rtnl_message_neigh_get_flags(sd_netlink_message *m, uint8_t *flags);
int sd_rtnl_message_new_addrlabel(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifindex, int ifal_family);
int sd_rtnl_message_addrlabel_set_prefixlen(sd_netlink_message *m, unsigned char prefixlen);
-int sd_rtnl_message_addrlabel_get_prefixlen(const sd_netlink_message *m, unsigned char *prefixlen);
+int sd_rtnl_message_addrlabel_get_prefixlen(sd_netlink_message *m, unsigned char *prefixlen);
int sd_rtnl_message_new_routing_policy_rule(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int ifal_family);
int sd_rtnl_message_routing_policy_rule_set_tos(sd_netlink_message *m, uint8_t tos);
-int sd_rtnl_message_routing_policy_rule_get_tos(const sd_netlink_message *m, uint8_t *tos);
+int sd_rtnl_message_routing_policy_rule_get_tos(sd_netlink_message *m, uint8_t *tos);
int sd_rtnl_message_routing_policy_rule_set_table(sd_netlink_message *m, uint8_t table);
-int sd_rtnl_message_routing_policy_rule_get_table(const sd_netlink_message *m, uint8_t *table);
+int sd_rtnl_message_routing_policy_rule_get_table(sd_netlink_message *m, uint8_t *table);
int sd_rtnl_message_routing_policy_rule_set_fib_src_prefixlen(sd_netlink_message *m, uint8_t len);
-int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(const sd_netlink_message *m, uint8_t *len);
+int sd_rtnl_message_routing_policy_rule_get_fib_src_prefixlen(sd_netlink_message *m, uint8_t *len);
int sd_rtnl_message_routing_policy_rule_set_fib_dst_prefixlen(sd_netlink_message *m, uint8_t len);
-int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(const sd_netlink_message *m, uint8_t *len);
+int sd_rtnl_message_routing_policy_rule_get_fib_dst_prefixlen(sd_netlink_message *m, uint8_t *len);
int sd_rtnl_message_routing_policy_rule_set_fib_type(sd_netlink_message *m, uint8_t type);
-int sd_rtnl_message_routing_policy_rule_get_fib_type(const sd_netlink_message *m, uint8_t *type);
+int sd_rtnl_message_routing_policy_rule_get_fib_type(sd_netlink_message *m, uint8_t *type);
int sd_rtnl_message_routing_policy_rule_set_flags(sd_netlink_message *m, uint32_t flags);
-int sd_rtnl_message_routing_policy_rule_get_flags(const sd_netlink_message *m, uint32_t *flags);
+int sd_rtnl_message_routing_policy_rule_get_flags(sd_netlink_message *m, uint32_t *flags);
int sd_rtnl_message_new_qdisc(sd_netlink *rtnl, sd_netlink_message **ret, uint16_t nlmsg_type, int tcm_family, int tcm_ifindex);
int sd_rtnl_message_set_qdisc_parent(sd_netlink_message *m, uint32_t parent);
@@ -252,7 +252,7 @@ int sd_nfnl_nft_message_add_setelem_end(sd_netlink_message *m);
/* genl */
int sd_genl_socket_open(sd_netlink **nl);
int sd_genl_message_new(sd_netlink *nl, sd_genl_family_t family, uint8_t cmd, sd_netlink_message **m);
-int sd_genl_message_get_family(const sd_netlink *nl, const sd_netlink_message *m, sd_genl_family_t *family);
+int sd_genl_message_get_family(sd_netlink *nl, sd_netlink_message *m, sd_genl_family_t *family);
/* slot */
sd_netlink_slot *sd_netlink_slot_ref(sd_netlink_slot *nl);
@@ -261,11 +261,11 @@ sd_netlink_slot *sd_netlink_slot_unref(sd_netlink_slot *nl);
sd_netlink *sd_netlink_slot_get_netlink(sd_netlink_slot *slot);
void *sd_netlink_slot_get_userdata(sd_netlink_slot *slot);
void *sd_netlink_slot_set_userdata(sd_netlink_slot *slot, void *userdata);
-int sd_netlink_slot_get_destroy_callback(const sd_netlink_slot *slot, sd_netlink_destroy_t *callback);
+int sd_netlink_slot_get_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t *callback);
int sd_netlink_slot_set_destroy_callback(sd_netlink_slot *slot, sd_netlink_destroy_t callback);
-int sd_netlink_slot_get_floating(const sd_netlink_slot *slot);
+int sd_netlink_slot_get_floating(sd_netlink_slot *slot);
int sd_netlink_slot_set_floating(sd_netlink_slot *slot, int b);
-int sd_netlink_slot_get_description(const sd_netlink_slot *slot, const char **description);
+int sd_netlink_slot_get_description(sd_netlink_slot *slot, const char **description);
int sd_netlink_slot_set_description(sd_netlink_slot *slot, const char *description);
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_netlink, sd_netlink_unref);
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
index 848e5e867c..dd55360ee5 100644
--- a/src/sysusers/sysusers.c
+++ b/src/sysusers/sysusers.c
@@ -1492,7 +1492,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
name = mfree(name);
if (name) {
- r = specifier_printf(name, specifier_table, NULL, &resolved_name);
+ r = specifier_printf(name, NAME_MAX, specifier_table, NULL, &resolved_name);
if (r < 0)
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m", fname, line, name);
@@ -1507,7 +1507,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
id = mfree(id);
if (id) {
- r = specifier_printf(id, specifier_table, NULL, &resolved_id);
+ r = specifier_printf(id, PATH_MAX-1, specifier_table, NULL, &resolved_id);
if (r < 0)
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
fname, line, name);
@@ -1518,7 +1518,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
description = mfree(description);
if (description) {
- r = specifier_printf(description, specifier_table, NULL, &resolved_description);
+ r = specifier_printf(description, LONG_LINE_MAX, specifier_table, NULL, &resolved_description);
if (r < 0)
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
fname, line, description);
@@ -1534,7 +1534,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
home = mfree(home);
if (home) {
- r = specifier_printf(home, specifier_table, NULL, &resolved_home);
+ r = specifier_printf(home, PATH_MAX-1, specifier_table, NULL, &resolved_home);
if (r < 0)
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
fname, line, home);
@@ -1550,7 +1550,7 @@ static int parse_line(const char *fname, unsigned line, const char *buffer) {
shell = mfree(shell);
if (shell) {
- r = specifier_printf(shell, specifier_table, NULL, &resolved_shell);
+ r = specifier_printf(shell, PATH_MAX-1, specifier_table, NULL, &resolved_shell);
if (r < 0)
return log_error_errno(r, "[%s:%u] Failed to replace specifiers in '%s': %m",
fname, line, shell);
diff --git a/src/test/test-load-fragment.c b/src/test/test-load-fragment.c
index 40c1fd0532..50345b7b1e 100644
--- a/src/test/test-load-fragment.c
+++ b/src/test/test-load-fragment.c
@@ -512,7 +512,7 @@ static void test_install_printf(void) {
_cleanup_free_ char \
*d1 = strdup(i.name), \
*d2 = strdup(i.path); \
- assert_se(install_full_printf(&src, pattern, &t) >= 0 || !result); \
+ assert_se(install_name_printf(&src, pattern, &t) >= 0 || !result); \
memzero(i.name, strlen(i.name)); \
memzero(i.path, strlen(i.path)); \
assert_se(d1 && d2); \
diff --git a/src/test/test-specifier.c b/src/test/test-specifier.c
index 2648c1c3f5..e9d501955c 100644
--- a/src/test/test-specifier.c
+++ b/src/test/test-specifier.c
@@ -56,6 +56,38 @@ static const Specifier specifier_table[] = {
{}
};
+static void test_specifier_printf(void) {
+ static const Specifier table[] = {
+ { 'X', specifier_string, (char*) "AAAA" },
+ { 'Y', specifier_string, (char*) "BBBB" },
+ COMMON_SYSTEM_SPECIFIERS,
+ {}
+ };
+
+ _cleanup_free_ char *w = NULL;
+ int r;
+
+ log_info("/* %s */", __func__);
+
+ r = specifier_printf("xxx a=%X b=%Y yyy", SIZE_MAX, table, NULL, &w);
+ assert_se(r >= 0);
+ assert_se(w);
+
+ puts(w);
+ assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
+
+ free(w);
+ r = specifier_printf("machine=%m, boot=%b, host=%H, version=%v, arch=%a", SIZE_MAX, table, NULL, &w);
+ assert_se(r >= 0);
+ assert_se(w);
+ puts(w);
+
+ w = mfree(w);
+ specifier_printf("os=%o, os-version=%w, build=%B, variant=%W", SIZE_MAX, table, NULL, &w);
+ if (w)
+ puts(w);
+}
+
static void test_specifiers(void) {
log_info("/* %s */", __func__);
@@ -65,7 +97,7 @@ static void test_specifiers(void) {
xsprintf(spec, "%%%c", s->specifier);
- assert_se(specifier_printf(spec, specifier_table, NULL, &resolved) >= 0);
+ assert_se(specifier_printf(spec, SIZE_MAX, specifier_table, NULL, &resolved) >= 0);
log_info("%%%c → %s", s->specifier, resolved);
}
@@ -76,6 +108,7 @@ int main(int argc, char *argv[]) {
test_specifier_escape();
test_specifier_escape_strv();
+ test_specifier_printf();
test_specifiers();
return 0;
diff --git a/src/test/test-strv.c b/src/test/test-strv.c
index 039bb2c78a..134525288f 100644
--- a/src/test/test-strv.c
+++ b/src/test/test-strv.c
@@ -3,42 +3,9 @@
#include "alloc-util.h"
#include "escape.h"
#include "nulstr-util.h"
-#include "specifier.h"
#include "string-util.h"
#include "strv.h"
-static void test_specifier_printf(void) {
- static const Specifier table[] = {
- { 'X', specifier_string, (char*) "AAAA" },
- { 'Y', specifier_string, (char*) "BBBB" },
- COMMON_SYSTEM_SPECIFIERS,
- {}
- };
-
- _cleanup_free_ char *w = NULL;
- int r;
-
- log_info("/* %s */", __func__);
-
- r = specifier_printf("xxx a=%X b=%Y yyy", table, NULL, &w);
- assert_se(r >= 0);
- assert_se(w);
-
- puts(w);
- assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
-
- free(w);
- r = specifier_printf("machine=%m, boot=%b, host=%H, version=%v, arch=%a", table, NULL, &w);
- assert_se(r >= 0);
- assert_se(w);
- puts(w);
-
- w = mfree(w);
- specifier_printf("os=%o, os-version=%w, build=%B, variant=%W", table, NULL, &w);
- if (w)
- puts(w);
-}
-
static void test_str_in_set(void) {
log_info("/* %s */", __func__);
@@ -1022,7 +989,6 @@ static void test_strv_fnmatch(void) {
}
int main(int argc, char *argv[]) {
- test_specifier_printf();
test_str_in_set();
test_strptr_in_set();
test_startswith_set();
diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
index 9529b09b3f..1e09c256b0 100644
--- a/src/tmpfiles/tmpfiles.c
+++ b/src/tmpfiles/tmpfiles.c
@@ -2522,7 +2522,7 @@ static int specifier_expansion_from_arg(Item *i) {
if (r < 0)
return log_error_errno(r, "Failed to unescape parameter to write: %s", i->argument);
- r = specifier_printf(unescaped, specifier_table, NULL, &resolved);
+ r = specifier_printf(unescaped, PATH_MAX-1, specifier_table, NULL, &resolved);
if (r < 0)
return r;
@@ -2532,7 +2532,7 @@ static int specifier_expansion_from_arg(Item *i) {
case SET_XATTR:
case RECURSIVE_SET_XATTR:
STRV_FOREACH(xattr, i->xattrs) {
- r = specifier_printf(*xattr, specifier_table, NULL, &resolved);
+ r = specifier_printf(*xattr, SIZE_MAX, specifier_table, NULL, &resolved);
if (r < 0)
return r;
@@ -2706,7 +2706,7 @@ static int parse_line(
i.append_or_force = append_or_force;
i.allow_failure = allow_failure;
- r = specifier_printf(path, specifier_table, NULL, &i.path);
+ r = specifier_printf(path, PATH_MAX-1, specifier_table, NULL, &i.path);
if (r == -ENXIO)
return log_unresolvable_specifier(fname, line);
if (r < 0) {