return string;
}
+static int
+auth_request_escape_wrapper(const char *input, const char **output_r,
+ void *context, const char **error_r ATTR_UNUSED)
+{
+ const struct auth_request_var_expand_ctx *ctx = context;
+ *output_r = ctx->escape_func(input, ctx->auth_request);
+ return 0;
+}
+
const char *
auth_request_str_escape(const char *string,
const struct auth_request *request ATTR_UNUSED)
const struct var_expand_params params = {
.table = table,
.providers = auth_request_var_expand_providers,
- .escape_func = (var_expand_escape_func_t *)ctx.escape_func,
+ .escape_func = auth_request_escape_wrapper,
.context = &ctx,
- .escape_context = (void *)auth_request,
+ .escape_context = &ctx,
.event = auth_request->event,
};
*sensitive_r = array_front(&sensitive_attr_names);
}
-const char *ldap_escape(const char *input, void *context ATTR_UNUSED)
+int ldap_escape(const char *input, const char **output_r,
+ void *context ATTR_UNUSED, const char **error_r ATTR_UNUSED)
{
/* This function escapes both LDAP filters and LDAP DNs. This works,
because both allow using the method of escaping any characters.
(required by DN) */
if (pos > 0 && input[pos - 1] == ' ')
pos--;
- else
- return input;
+ else {
+ *output_r = input;
+ return 0;
+ }
}
}
pos--;
} while (pos < input_len);
str_append_data(str, input, pos);
- return str_c(str);
+ *output_r = str_c(str);
+ return 0;
}
static bool
void db_ldap_enable_input(struct ldap_connection *conn, bool enable);
-const char *ldap_dn_escape(const char *str, void *context);
-const char *ldap_escape(const char *str, void *context);
+int ldap_dn_escape(const char *str, const char **output_r, void *context, const char **error_r);
+int ldap_escape(const char *str, const char **output_r, void *context, const char **error_r);
const char *ldap_get_error(struct ldap_connection *conn);
struct db_ldap_result_iterate_context *
auth_request_unref(&auth_request);
}
-static const char *passdb_sql_escape(const char *str, void *context)
+static int passdb_sql_escape(const char *str, const char **output_r,
+ void *context, const char **error_r ATTR_UNUSED)
{
struct sql_db *db = context;
- return sql_escape_string(db, str);
+ *output_r = sql_escape_string(db, str);
+ return 0;
}
static void sql_lookup_pass(struct passdb_sql_request *sql_request)
return dest;
}
+static int
+test_escape_varexpand(const char *string, const char **output_r,
+ void *context, const char **error_r ATTR_UNUSED)
+{
+ *output_r = test_escape(string, context);
+ return 0;
+}
+
static bool test_empty_request(string_t *str, const char *input)
{
const struct var_expand_params params = {
const struct var_expand_params params = {
.table = auth_request_get_var_expand_table(&test_request),
- .escape_func = (var_expand_escape_func_t *)test_escape,
+ .escape_func = test_escape_varexpand,
.escape_context = &test_request,
};
struct var_expand_params params = {
.table = auth_request_get_var_expand_table(&test_request),
- .escape_func = (var_expand_escape_func_t *)test_escape,
+ .escape_func = test_escape_varexpand,
.escape_context = &test_request
};
test_assert(var_expand(str, test_input, ¶ms, &error) == 0);
const struct var_expand_params params = {
.table = auth_request_get_var_expand_table(&test_request),
- .escape_func = (var_expand_escape_func_t *)test_escape,
+ .escape_func = test_escape_varexpand,
.escape_context = &test_request,
};
test_request.fields.user = t_strdup_noconst(tests[i].username);
const struct var_expand_params params = {
.table = auth_request_get_var_expand_table(&test_request),
- .escape_func = (var_expand_escape_func_t *)test_escape,
+ .escape_func = test_escape_varexpand,
.escape_context = &test_request,
};
str_truncate(str, 0);
};
test_begin("ldap_escape()");
for (unsigned int i = 0; i < N_ELEMENTS(tests); i++) {
- test_assert_strcmp_idx(ldap_escape(tests[i].input, NULL),
- tests[i].output, i);
+ const char *output, *error;
+ test_assert(ldap_escape(tests[i].input, &output, NULL, &error) == 0);
+ test_assert_strcmp_idx(output, tests[i].output, i);
}
test_end();
}
i_free(sql_request);
}
-static const char *userdb_sql_escape(const char *str, void *context)
+static int userdb_sql_escape(const char *str, const char **output_r,
+ void *context, const char **error_r ATTR_UNUSED)
{
struct sql_db *db = context;
- return sql_escape_string(db, str);
+ *output_r = sql_escape_string(db, str);
+ return 0;
}
static void userdb_sql_lookup(struct auth_request *auth_request,
#define IS_LDAP_ESCAPED_CHAR(c) \
((((unsigned char)(c)) & 0x80) != 0 || strchr(LDAP_ESCAPE_CHARS, (c)) != NULL)
-static const char *ldap_escape(const char *str, void *context ATTR_UNUSED)
+static int ldap_escape(const char *str, const char **output_r,
+ void *context ATTR_UNUSED, const char **error_r ATTR_UNUSED)
{
string_t *ret = NULL;
str_append_c(ret, *p);
}
- return ret == NULL ? str : str_c(ret);
+ *output_r = ret == NULL ? str : str_c(ret);
+ return 0;
}
static
if (state.transfer_set) {
if (!program->only_literal && !state.transfer_safe &&
params->escape_func != NULL) {
- str_append(state.result,
- params->escape_func(str_c(state.transfer),
- params->escape_context));
+ const char *escaped;
+ if (params->escape_func(str_c(state.transfer), &escaped,
+ params->escape_context, error_r) < 0)
+ return -1;
+ str_append(state.result, escaped);
} else
str_append_str(state.result, state.transfer);
} else {
test_end();
}
-static const char *test_escape(const char *str, void *context)
+static int test_escape(const char *str, const char **output_r,
+ void *context, const char **error_r ATTR_UNUSED)
{
const char *escape_chars = context;
string_t *dest = t_str_new(strlen(str) + 2);
}
}
str_append_c(dest, '\'');
- return str_c(dest);
+ *output_r = str_c(dest);
+ return 0;
}
static void test_var_expand_escape(void)
*/
typedef int value_provider_func_t(const char *key, const char **value_r,
void *context, const char **error_r);
-/* Used for escaping values, gets given string to escape and context,
- must return escaped string. */
-typedef const char *var_expand_escape_func_t(const char *str, void *context);
+/* Used for escaping values. On success sets output_r and returns 0.
+ On failure sets error_r and returns -1. */
+typedef int var_expand_escape_func_t(const char *input, const char **output_r,
+ void *context, const char **error_r);
struct var_expand_parser_state;
struct var_expand_program;