{
const char *authzid, *error;
+ if (auth_request_fail_on_nuls(request, data, data_size))
+ return;
+
authzid = t_strndup(data, data_size);
if (request->user == NULL) {
e_info(request->mech_event,
static const char prompt2[] = "Password:";
const char *username, *error;
+ if (auth_request_fail_on_nuls(request, data, data_size))
+ return;
+
if (request->user == NULL) {
username = t_strndup(data, data_size);
(struct otp_auth_request *)auth_request;
const char *answer;
+ if (auth_request_fail_on_nuls(auth_request, credentials, size))
+ return;
+
if (otp_parse_dbentry(t_strndup(credentials, size),
&request->state) != 0) {
e_error(request->auth_request.mech_event,
}
}
- if ((count < 1) || (count > 2)) {
+ if (count != 1) {
e_error(request->auth_request.mech_event,
"invalid input");
auth_request_fail(auth_request);
mech_otp_auth_phase2(struct auth_request *auth_request,
const unsigned char *data, size_t data_size)
{
+ if (auth_request_fail_on_nuls(auth_request, data, data_size))
+ return;
+
const char *str = t_strndup(data, data_size);
if (str_begins(str, "hex:")) {
struct rpa_auth_request *request =
(struct rpa_auth_request *)auth_request;
+ if (auth_request_fail_on_nuls(auth_request, data, data_size))
+ return;
+
switch (request->phase) {
case 0:
mech_rpa_auth_phase1(auth_request, data, data_size);
const char *server_final_message;
size_t len;
+ if (auth_request_fail_on_nuls(auth_request, data, data_size))
+ return;
+
if (request->client_first_message_bare == NULL) {
/* Received client-first-message */
if (parse_scram_client_first(request, data,
mech_skey_auth_continue(struct auth_request *auth_request,
const unsigned char *data, size_t data_size)
{
+ if (auth_request_fail_on_nuls(auth_request, data, data_size))
+ return;
+
if (auth_request->user == NULL) {
mech_skey_auth_phase1(auth_request, data, data_size);
} else {
pool_unref(&request->pool);
}
+bool auth_request_fail_on_nuls(struct auth_request *request,
+ const unsigned char *data, size_t data_size)
+{
+ if (memchr(data, '\0', data_size) != NULL) {
+ e_debug(request->mech_event, "Unexpected NUL in auth data");
+ auth_request_fail(request);
+ return TRUE;
+ }
+ return FALSE;
+}
+
extern const struct mech_module mech_plain;
extern const struct mech_module mech_login;
extern const struct mech_module mech_apop;
void mech_generic_auth_initial(struct auth_request *request,
const unsigned char *data, size_t data_size);
void mech_generic_auth_free(struct auth_request *request);
+bool auth_request_fail_on_nuls(struct auth_request *request,
+ const unsigned char *data, size_t data_size);
struct mechanisms_register *
mech_register_init(const struct auth_settings *set);