]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-sasl: dsasl-client - Check for NULs in server response
authorAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 6 May 2020 10:47:36 +0000 (13:47 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Mon, 11 May 2020 08:44:04 +0000 (11:44 +0300)
If server response unexpectedly contains embedded NULs, fail
authentication.

src/lib-sasl/dsasl-client-private.h
src/lib-sasl/dsasl-client.c

index 3b0c202b1cd20a06dd65ee38e381d44ea32bca07..65b86f70b86cde491842ad4db733fabf789682ff 100644 (file)
@@ -3,6 +3,10 @@
 
 #include "dsasl-client.h"
 
+enum dsasl_mech_security_flags {
+       DSASL_MECH_SEC_ALLOW_NULS       = 0x0001,
+};
+
 struct dsasl_client {
        pool_t pool;
        struct dsasl_client_settings set;
@@ -13,6 +17,7 @@ struct dsasl_client {
 struct dsasl_client_mech {
        const char *name;
        size_t struct_size;
+       enum dsasl_mech_security_flags flags;
 
        int (*input)(struct dsasl_client *client,
                     const unsigned char *input, size_t input_len,
index ff02710d4d9c32f80b8dc3d41e0688a1f8672336..6d0c130b070a336759757c9be358ec4d18795e78 100644 (file)
@@ -86,6 +86,11 @@ int dsasl_client_input(struct dsasl_client *client,
                       const unsigned char *input, size_t input_len,
                       const char **error_r)
 {
+       if ((client->mech->flags & DSASL_MECH_SEC_ALLOW_NULS) == 0 &&
+           memchr(input, '\0', input_len) != NULL) {
+               *error_r = "Unexpected NUL in input data";
+               return -1;
+       }
        return client->mech->input(client, input, input_len, error_r);
 }