From: Timo Sirainen Date: Thu, 9 Mar 2023 22:07:38 +0000 (+0200) Subject: lib-settings: Add settings_parse_keyvalue_nodup() X-Git-Tag: 2.4.0~2224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a8204511db4df1d157f3561dd9580bee153ee9b;p=thirdparty%2Fdovecot%2Fcore.git lib-settings: Add settings_parse_keyvalue_nodup() --- diff --git a/src/lib-settings/settings-parser.c b/src/lib-settings/settings-parser.c index cdd65e9bc0..8d9519cf35 100644 --- a/src/lib-settings/settings-parser.c +++ b/src/lib-settings/settings-parser.c @@ -451,7 +451,7 @@ get_in_port_zero(struct setting_parser_context *ctx, const char *value, static int settings_parse(struct setting_parser_context *ctx, struct setting_link *link, const struct setting_define *def, - const char *key, const char *value) + const char *key, const char *value, bool dup_value) { void *ptr, *change_ptr; const void *ptr2; @@ -507,7 +507,9 @@ settings_parse(struct setting_parser_context *ctx, struct setting_link *link, return -1; break; case SET_STR: - *((char **)ptr) = p_strdup(ctx->set_pool, value); + if (dup_value) + value = p_strdup(ctx->set_pool, value); + *((const char **)ptr) = value; break; case SET_STR_VARS: *((char **)ptr) = p_strconcat(ctx->set_pool, @@ -650,8 +652,9 @@ settings_parse_strlist(struct setting_parser_context *ctx, array_push_back(link->array, &vvalue); } -int settings_parse_keyvalue(struct setting_parser_context *ctx, - const char *key, const char *value) +static int +settings_parse_keyvalue_real(struct setting_parser_context *ctx, + const char *key, const char *value, bool dup_value) { const struct setting_define *def; struct setting_link *link; @@ -673,13 +676,25 @@ int settings_parse_keyvalue(struct setting_parser_context *ctx, return 1; } - if (settings_parse(ctx, link, def, key, value) < 0) + if (settings_parse(ctx, link, def, key, value, dup_value) < 0) return -1; /* there may be more instances of the setting */ } while (settings_find_key_nth(ctx, key, &n, &def, &link)); return 1; } +int settings_parse_keyvalue(struct setting_parser_context *ctx, + const char *key, const char *value) +{ + return settings_parse_keyvalue_real(ctx, key, value, TRUE); +} + +int settings_parse_keyvalue_nodup(struct setting_parser_context *ctx, + const char *key, const char *value) +{ + return settings_parse_keyvalue_real(ctx, key, value, FALSE); +} + const char *settings_parse_unalias(struct setting_parser_context *ctx, const char *key) { diff --git a/src/lib-settings/settings-parser.h b/src/lib-settings/settings-parser.h index 2453e3dae5..3ca82202d4 100644 --- a/src/lib-settings/settings-parser.h +++ b/src/lib-settings/settings-parser.h @@ -157,6 +157,10 @@ int settings_parse_line(struct setting_parser_context *ctx, const char *line); /* Parse key/value pair. Returns 1 if OK, 0 if key is unknown, -1 if error. */ int settings_parse_keyvalue(struct setting_parser_context *ctx, const char *key, const char *value); +/* Same as settings_parse_keyvalue(), but don't strdup() the value. The value + pointer's validity must be enforced by the caller. */ +int settings_parse_keyvalue_nodup(struct setting_parser_context *ctx, + const char *key, const char *value); /* Call all check_func()s to see if currently parsed settings are valid. */ bool settings_parser_check(struct setting_parser_context *ctx, pool_t pool, const char **error_r);