diff --git a/backport-drbdadm-add-const-qualifier-to-char-for-file-names.patch b/backport-drbdadm-add-const-qualifier-to-char-for-file-names.patch new file mode 100644 index 0000000000000000000000000000000000000000..a04bec02b0c8151bab3b96b7b24963a0d9b50e31 --- /dev/null +++ b/backport-drbdadm-add-const-qualifier-to-char-for-file-names.patch @@ -0,0 +1,446 @@ +From 8b6f80f9925a0b72b90a7fb36d7af9ffd81fba9d Mon Sep 17 00:00:00 2001 +From: Lars Ellenberg +Date: Wed, 14 May 2025 07:32:08 +0200 +Subject: [PATCH 085/200] drbdadm: add const qualifier to char* for file names + +When handling supposedly constant strings, +we should use (const char *) more often. +--- + user/shared/shared_parser.c | 4 ++-- + user/shared/shared_parser.h | 8 ++++---- + user/shared/shared_tool.c | 10 ++++++---- + user/shared/shared_tool.h | 4 ++-- + user/v84/drbdadm.h | 8 ++++---- + user/v84/drbdadm_main.c | 18 ++++++++++-------- + user/v84/drbdadm_parser.c | 5 +++-- + user/v9/drbdadm.h | 8 ++++---- + user/v9/drbdadm_main.c | 14 ++++++++------ + user/v9/drbdadm_parser.c | 2 +- + user/v9/drbdadm_postparse.c | 2 +- + 11 files changed, 45 insertions(+), 38 deletions(-) + +diff --git a/user/shared/shared_parser.c b/user/shared/shared_parser.c +index 9f9644e9..4138c105 100644 +--- a/user/shared/shared_parser.c ++++ b/user/shared/shared_parser.c +@@ -40,7 +40,7 @@ + extern void my_parse(void); + + +-void save_parse_context(struct include_file_buffer *buffer, FILE *f, char *name) ++void save_parse_context(struct include_file_buffer *buffer, FILE *f, const char *name) + { + buffer->line = line; + buffer->config_file = config_file; +@@ -63,7 +63,7 @@ void restore_parse_context(struct include_file_buffer *buffer) + config_save = buffer->config_save; + } + +-void include_file(FILE *f, char *name) ++void include_file(FILE *f, const char *name) + { + struct include_file_buffer buffer; + +diff --git a/user/shared/shared_parser.h b/user/shared/shared_parser.h +index 4e073772..80821d97 100644 +--- a/user/shared/shared_parser.h ++++ b/user/shared/shared_parser.h +@@ -26,12 +26,12 @@ + + struct include_file_buffer { + int line; +- char *config_file; +- char *config_save; ++ const char *config_file; ++ const char *config_save; + }; + +-void include_file(FILE *f, char *name); +-void save_parse_context(struct include_file_buffer *buffer, FILE *f, char *name); ++void include_file(FILE *f, const char *name); ++void save_parse_context(struct include_file_buffer *buffer, FILE *f, const char *name); + void restore_parse_context(struct include_file_buffer *buffer); + + int check_uniq(const char *what, const char *fmt, ...); +diff --git a/user/shared/shared_tool.c b/user/shared/shared_tool.c +index 20598132..073e3110 100644 +--- a/user/shared/shared_tool.c ++++ b/user/shared/shared_tool.c +@@ -982,10 +982,11 @@ int log_err(const char *format, ...) + * so any legal input do drbdadm "drbdadm dump" should result in output, which, + * if fed into an additional "drbdadm dump" should give the same output again. + */ +-const char *esc(char *str) ++const char *esc(const char *str) + { + static char buffer[1024]; +- char *ue = str, *e = buffer; ++ const char *ue = str; ++ char *e = buffer; + + if (!str || !str[0]) { + return "\"\""; +@@ -1015,10 +1016,11 @@ const char *esc(char *str) + + /* escape a few things that are not legal in xml content; good enough for our + * purposes, but likely not "academically correct" resp. "complete". */ +-const char *esc_xml(char *str) ++const char *esc_xml(const char *str) + { + static char buffer[1024]; +- char *ue = str, *e = buffer; ++ const char *ue = str; ++ char *e = buffer; + + if (!str || !str[0]) { + return ""; +diff --git a/user/shared/shared_tool.h b/user/shared/shared_tool.h +index 3dedf796..39e1b641 100644 +--- a/user/shared/shared_tool.h ++++ b/user/shared/shared_tool.h +@@ -115,8 +115,8 @@ extern void dt_pretty_print_gc(const uint32_t* gen_cnt); + + extern void initialize_logging(void); + extern int log_err(const char *format, ...); +-extern const char *esc_xml(char *str); +-extern const char *esc(char *str); ++extern const char *esc_xml(const char *str); ++extern const char *esc(const char *str); + + bool ipv4_addresses_match(const char *addr_1st, const char *addr_2nd); + +diff --git a/user/v84/drbdadm.h b/user/v84/drbdadm.h +index 1cf2a856..ced1f96c 100644 +--- a/user/v84/drbdadm.h ++++ b/user/v84/drbdadm.h +@@ -109,7 +109,7 @@ struct d_resource + struct d_option* proxy_plugins; + struct d_resource* next; + struct d_name *become_primary_on; +- char *config_file; /* The config file this resource is define in.*/ ++ const char *config_file; /* The config file this resource is define in.*/ + int start_line; + unsigned int stacked_timeouts:1; + unsigned int ignore:1; +@@ -135,7 +135,7 @@ struct cfg_ctx { + }; + + +-extern char *canonify_path(char *path); ++extern char *canonify_path(const char *path); + + extern int adm_adjust(struct cfg_ctx *); + extern int adm_new_minor(struct cfg_ctx *ctx); +@@ -228,8 +228,8 @@ int do_proxy_conn_up(struct cfg_ctx *ctx); + int do_proxy_conn_down(struct cfg_ctx *ctx); + int do_proxy_conn_plugins(struct cfg_ctx *ctx); + +-extern char *config_file; +-extern char *config_save; ++extern const char *config_file; ++extern const char *config_save; + extern int config_valid; + extern struct d_resource* config; + extern struct d_resource* common; +diff --git a/user/v84/drbdadm_main.c b/user/v84/drbdadm_main.c +index c2bb5858..fe92a94d 100644 +--- a/user/v84/drbdadm_main.c ++++ b/user/v84/drbdadm_main.c +@@ -180,8 +180,8 @@ struct utsname nodeinfo; + int line = 1; + int fline; + +-char *config_file = NULL; +-char *config_save = NULL; ++const char *config_file = NULL; ++const char *config_save = NULL; + char *config_test = NULL; + struct d_resource *config = NULL; + struct d_resource *common = NULL; +@@ -2919,7 +2919,7 @@ void sanity_check_cmd(char *cmd_name) + * dopd cannot work. + * NOTE: we assume that any gid != 0 will be the group dopd will run as, + * typically haclient. */ +-void sanity_check_conf(char *c) ++void sanity_check_conf(const char *c) + { + struct stat sb; + +@@ -3100,7 +3100,7 @@ static void global_validate_maybe_expand_die_if_invalid(int expand, enum pp_flag + * aborts if any allocation or syscall fails. + * return value should be free()d, once no longer needed. + */ +-char *canonify_path(char *path) ++char *canonify_path(const char *path) + { + int cwd_fd = -1; + char *last_slash; +@@ -3245,6 +3245,7 @@ struct adm_cmd *find_cmd(char *cmdname); + int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_names) + { + const char *optstring = make_optstring(admopt); ++ char *tmp; + int longindex, first_arg_index; + int i; + +@@ -3290,7 +3291,7 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + case 'c': + if (!strcmp(optarg, "-")) { + yyin = stdin; +- if (asprintf(&config_file, "STDIN") < 0) { ++ if (asprintf(&tmp, "STDIN") < 0) { + log_err("asprintf(config_file): %m\n"); + return 20; + } +@@ -3301,11 +3302,12 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + log_err("Can not open '%s'.\n.", optarg); + exit(E_EXEC_ERROR); + } +- if (asprintf(&config_file, "%s", optarg) < 0) { ++ if (asprintf(&tmp, "%s", optarg) < 0) { + log_err("asprintf(config_file): %m\n"); + return 20; + } + } ++ config_file = tmp; + break; + case 't': + config_test = optarg; +@@ -3686,8 +3688,8 @@ int main(int argc, char **argv) + my_parse(); + + if (config_test) { +- char *saved_config_file = config_file; +- char *saved_config_save = config_save; ++ const char *saved_config_file = config_file; ++ const char *saved_config_save = config_save; + + config_file = config_test; + config_save = canonify_path(config_test); +diff --git a/user/v84/drbdadm_parser.c b/user/v84/drbdadm_parser.c +index 6e5d4b20..6ca6fa71 100644 +--- a/user/v84/drbdadm_parser.c ++++ b/user/v84/drbdadm_parser.c +@@ -2065,14 +2065,15 @@ void post_parse(struct d_resource *config, enum pp_flags flags) + } + + /* Returns the "previous" count, ie. 0 if this file wasn't seen before. */ +-int was_file_already_seen(char *fn) ++int was_file_already_seen(const char *fn) + { + ENTRY e, *ep; + char *real_path; + + real_path = realpath(fn, NULL); + if (!real_path) +- real_path = fn; ++ real_path = strdup(fn); ++ assert(real_path); + + ep = NULL; + e.key = real_path; +diff --git a/user/v9/drbdadm.h b/user/v9/drbdadm.h +index 489da40d..d96950c0 100644 +--- a/user/v9/drbdadm.h ++++ b/user/v9/drbdadm.h +@@ -241,7 +241,7 @@ struct d_resource + struct options proxy_options; + struct options proxy_plugins; + STAILQ_ENTRY(d_resource) link; +- char *config_file; /* The config file this resource is define in.*/ ++ const char *config_file; /* The config file this resource is define in.*/ + int start_line; + unsigned int stacked_timeouts:1; + unsigned int ignore:1; +@@ -314,7 +314,7 @@ struct cfg_ctx { + }; + + +-extern char *canonify_path(char *path); ++extern char *canonify_path(const char *path); + extern int pushd(const char *path); + extern void popd(int fd); + +@@ -458,8 +458,8 @@ bool peer_diskless(struct peer_device *peer_device); + + const struct field_def *find_field(bool *no_prefix, const struct context_def *options_def, const char *name); + +-extern char *config_file; +-extern char *config_save; ++extern const char *config_file; ++extern const char *config_save; + extern int config_valid; + extern struct resources config; + extern struct d_resource* common; +diff --git a/user/v9/drbdadm_main.c b/user/v9/drbdadm_main.c +index a748e5b6..426c2833 100644 +--- a/user/v9/drbdadm_main.c ++++ b/user/v9/drbdadm_main.c +@@ -146,9 +146,9 @@ const char *hostname; + int line = 1; + int fline; + +-char *config_file = NULL; +-char *config_save = NULL; +-char *config_test = NULL; ++const char *config_file = NULL; ++const char *config_save = NULL; ++const char *config_test = NULL; + struct resources config = STAILQ_HEAD_INITIALIZER(config); + struct d_resource *common = NULL; + struct ifreq *ifreq_list = NULL; +@@ -3032,7 +3032,7 @@ void popd(int fd) + * aborts if any allocation or syscall fails. + * return value should be free()d, once no longer needed. + */ +-char *canonify_path(char *path) ++char *canonify_path(const char *path) + { + int cwd_fd = -1; + char *last_slash; +@@ -3164,6 +3164,7 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + const char *optstring = make_optstring(admopt); + struct names backend_options_check; + struct d_name *b_opt; ++ char *tmp; + int longindex, first_arg_index; + + STAILQ_INIT(&backend_options_check); +@@ -3203,7 +3204,7 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + case 'c': + if (!strcmp(optarg, "-")) { + yyin = stdin; +- if (asprintf(&config_file, "STDIN") < 0) { ++ if (asprintf(&tmp, "STDIN") < 0) { + log_err("asprintf(config_file): %m\n"); + return 20; + } +@@ -3214,11 +3215,12 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + log_err("Can not open '%s'.\n.", optarg); + exit(E_EXEC_ERROR); + } +- if (asprintf(&config_file, "%s", optarg) < 0) { ++ if (asprintf(&tmp, "%s", optarg) < 0) { + log_err("asprintf(config_file): %m\n"); + return 20; + } + } ++ config_file = tmp; + break; + case 't': + config_test = optarg; +diff --git a/user/v9/drbdadm_parser.c b/user/v9/drbdadm_parser.c +index 29eed437..f1b46671 100644 +--- a/user/v9/drbdadm_parser.c ++++ b/user/v9/drbdadm_parser.c +@@ -1879,7 +1879,7 @@ struct d_resource* parse_resource(char* res_name, enum pr_flags flags) + } + + /* Returns the "previous" count, ie. 0 if this file wasn't seen before. */ +-int was_file_already_seen(char *fn) ++int was_file_already_seen(const char *fn) + { + ENTRY *e; + char *real_path; +diff --git a/user/v9/drbdadm_postparse.c b/user/v9/drbdadm_postparse.c +index 7bbed717..52e3f203 100644 +--- a/user/v9/drbdadm_postparse.c ++++ b/user/v9/drbdadm_postparse.c +@@ -1424,7 +1424,7 @@ static void sanity_check_cmd(char *cmd_name) + * dopd cannot work. + * NOTE: we assume that any gid != 0 will be the group dopd will run as, + * typically haclient. */ +-static void sanity_check_conf(char *c) ++static void sanity_check_conf(const char *c) + { + struct stat sb; + +-- +2.33.1.windows.1 + +From 3dfddffeb382aece470128cefa3d53eb7a4ddab7 Mon Sep 17 00:00:00 2001 +From: Lars Ellenberg +Date: Wed, 14 May 2025 07:50:12 +0200 +Subject: [PATCH 086/200] drbdadm: drop trailing '.' from error message + +The message "Can not open '%s'.\n.", with that trailing dot, has been +accidentally introduced in the very first attempts of writing drbdadm, +drbdadm_main.c was not even four weeks old at that time. +It has been copy-pasted around since 2002 unnoticed. + +Finally drop those trailing dots. +--- + user/v84/drbdadm_main.c | 4 ++-- + user/v9/drbdadm_main.c | 4 ++-- + user/v9/drbdadm_postparse.c | 4 ++-- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/user/v84/drbdadm_main.c b/user/v84/drbdadm_main.c +index fe92a94d..865cf6ca 100644 +--- a/user/v84/drbdadm_main.c ++++ b/user/v84/drbdadm_main.c +@@ -3299,7 +3299,7 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + } else { + yyin = fopen(optarg, "r"); + if (!yyin) { +- log_err("Can not open '%s'.\n.", optarg); ++ log_err("Can not open '%s'.\n", optarg); + exit(E_EXEC_ERROR); + } + if (asprintf(&tmp, "%s", optarg) < 0) { +@@ -3697,7 +3697,7 @@ int main(int argc, char **argv) + fclose(yyin); + yyin = fopen(config_test, "r"); + if (!yyin) { +- log_err("Can not open '%s'.\n.", config_test); ++ log_err("Can not open '%s'.\n", config_test); + exit(E_EXEC_ERROR); + } + my_parse(); +diff --git a/user/v9/drbdadm_main.c b/user/v9/drbdadm_main.c +index 426c2833..ea26ce85 100644 +--- a/user/v9/drbdadm_main.c ++++ b/user/v9/drbdadm_main.c +@@ -3212,7 +3212,7 @@ int parse_options(int argc, char **argv, struct adm_cmd **cmd, char ***resource_ + } else { + yyin = fopen(optarg, "r"); + if (!yyin) { +- log_err("Can not open '%s'.\n.", optarg); ++ log_err("Can not open '%s'.\n", optarg); + exit(E_EXEC_ERROR); + } + if (asprintf(&tmp, "%s", optarg) < 0) { +@@ -3591,7 +3591,7 @@ int main(int argc, char **argv) + if (config_test) { + FILE *f = fopen(config_test, "r"); + if (!f) { +- log_err("Can not open '%s'.\n.", config_test); ++ log_err("Can not open '%s'.\n", config_test); + exit(E_EXEC_ERROR); + } + include_file(f, config_test); +diff --git a/user/v9/drbdadm_postparse.c b/user/v9/drbdadm_postparse.c +index 52e3f203..481a4172 100644 +--- a/user/v9/drbdadm_postparse.c ++++ b/user/v9/drbdadm_postparse.c +@@ -1223,7 +1223,7 @@ static void expand_opts(struct d_resource *res, struct context_def *oc, struct o + if (!is_equal(oc, existing_option, option)) { + log_err("%s:%d: in resource %s, " + "ambiguous inheritance for option \"%s\".\n" +- "should be \"%s\" and \"%s\" at the same time\n.", ++ "should be \"%s\" and \"%s\" at the same time.\n", + res->config_file, res->start_line, res->name, + option->name, existing_option->value, option->value); + config_valid = 0; +@@ -1231,7 +1231,7 @@ static void expand_opts(struct d_resource *res, struct context_def *oc, struct o + /* else { + log_err("%s:%d: WARNING: in resource %s, " + "multiple inheritance for option \"%s\".\n" +- "with same value\n.", ++ "with same value.\n", + res->config_file, res->start_line, res->name, + option->name, existing_option->value, option->value); + } +-- +2.33.1.windows.1 + diff --git a/drbd.spec b/drbd.spec index 380d2dd176b5b57426622515c0beca005415dabd..47ebe506619c02588e04231ef7ec4a605b0575f4 100644 --- a/drbd.spec +++ b/drbd.spec @@ -1,7 +1,7 @@ Name: drbd Summary: DRBD user-land tools and scripts Version: 9.31.0 -Release: 6 +Release: 7 Source0: http://www.linbit.com/downloads/%{name}/utils/%{name}-utils-%{version}.tar.gz Patch0: drbd-utils-9.12.2-disable_xsltproc_network_read.patch Patch1: drbd-utils-9.15.0-make_configure-workaround.patch @@ -10,6 +10,7 @@ Patch3: backport-drbdsetup-Output-device-config-in-drbdsetup-show.patch Patch4: backport-build-rpm-don-t-try-to-rm-drbdmon.8.gz-in-preun.patch Patch5: backport-drbdmeta-it-is-initialize-bitmap-not-i-b-mode.patch Patch6: backport-drbdadm-don-t-attempt-to-parse-a-directory-as-config.patch +Patch7: backport-drbdadm-add-const-qualifier-to-char-for-file-names.patch License: GPL-2.0-or-later ExclusiveOS: linux @@ -201,10 +202,13 @@ management utility. %systemd_preun drbd.service %changelog +* Tue Dec 02 2025 liupei - 9.31.0-7 +- drbdadm: add const qualifier to char* for file names +- drbdadm: drop trailing '.' from error message + * Thu Nov 27 2025 bizhiyuan - 9.31.0-6 - don't attempt to parse a directory as config file -- drbdadm: allow "dump minor-N"; plus new command - sh-list-config-file +- drbdadm: allow "dump minor-N"; plus new command sh-list-config-file * Wed Nov 26 2025 liupei - 9.31.0-5 - doc,drbdmeta: it is initialize-bitmap, not i-b-mode