[31198] in CVS-changelog-for-Kerberos-V5

home help back first fref pref prev next nref lref last post

krb5 commit: Simplify krb5_chpw_message() UTF-8 processing

daemon@ATHENA.MIT.EDU (ghudson@mit.edu)
Mon Dec 26 02:43:52 2022

From: ghudson@mit.edu
To: <cvs-krb5@mit.edu>
Message-ID: <20221226074343.D83E51050DF@krbdev.mit.edu>
Date: Mon, 26 Dec 2022 02:43:43 -0500 (EST)
MIME-Version: 1.0
Reply-To: krbdev@mit.edu
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: cvs-krb5-bounces@mit.edu

https://github.com/krb5/krb5/commit/c5507dff5f5b2936937442b43f6c021b4f8a493d
commit c5507dff5f5b2936937442b43f6c021b4f8a493d
Author: Greg Hudson <ghudson@mit.edu>
Date:   Sat Dec 10 00:40:44 2022 -0500

    Simplify krb5_chpw_message() UTF-8 processing
    
    Only validate the message as a UTF-8 string, rather than normalizing
    it.

 src/include/k5-unicode.h     |  2 ++
 src/lib/krb5/krb/chpw.c      | 10 ++++------
 src/lib/krb5/unicode/ucstr.c | 27 +++++++++++++++++++++++++++
 3 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/src/include/k5-unicode.h b/src/include/k5-unicode.h
index e51ab2fe8..45c1788b2 100644
--- a/src/include/k5-unicode.h
+++ b/src/include/k5-unicode.h
@@ -127,4 +127,6 @@ int krb5int_utf8_normcmp(
     const krb5_data *,
     unsigned);
 
+krb5_boolean k5_utf8_validate(const krb5_data *data);
+
 #endif /* K5_UNICODE_H */
diff --git a/src/lib/krb5/krb/chpw.c b/src/lib/krb5/krb/chpw.c
index cdec59521..803c80feb 100644
--- a/src/lib/krb5/krb/chpw.c
+++ b/src/lib/krb5/krb/chpw.c
@@ -477,7 +477,6 @@ krb5_chpw_message(krb5_context context, const krb5_data *server_string,
                   char **message_out)
 {
     krb5_error_code ret;
-    krb5_data *string;
     char *msg;
 
     *message_out = NULL;
@@ -493,11 +492,10 @@ krb5_chpw_message(krb5_context context, const krb5_data *server_string,
     /* If server_string contains a valid UTF-8 string, return that. */
     if (server_string->length > 0 &&
         memchr(server_string->data, 0, server_string->length) == NULL &&
-        krb5int_utf8_normalize(server_string, &string,
-                               KRB5_UTF8_APPROX) == 0) {
-        *message_out = string->data; /* already null terminated */
-        free(string);
-        return 0;
+        k5_utf8_validate(server_string)) {
+        *message_out = k5memdup0(server_string->data, server_string->length,
+                                 &ret);
+        return (*message_out == NULL) ? ENOMEM : 0;
     }
 
     /* server_string appears invalid, so try to be helpful. */
diff --git a/src/lib/krb5/unicode/ucstr.c b/src/lib/krb5/unicode/ucstr.c
index e3ed9bc64..0257882cd 100644
--- a/src/lib/krb5/unicode/ucstr.c
+++ b/src/lib/krb5/unicode/ucstr.c
@@ -18,6 +18,7 @@
 #include "k5-int.h"
 #include "k5-utf8.h"
 #include "k5-unicode.h"
+#include "k5-input.h"
 #include "ucdata/ucdata.h"
 
 #include <ctype.h>
@@ -100,6 +101,32 @@ krb5int_ucstr2upper(
     }
 }
 
+/* Return true if data contains valid UTF-8 sequences. */
+krb5_boolean
+k5_utf8_validate(const krb5_data *data)
+{
+    struct k5input in;
+    int len, tmplen, i;
+    const uint8_t *bytes;
+
+    k5_input_init(&in, data->data, data->length);
+    while (!in.status && in.len > 0) {
+	len = KRB5_UTF8_CHARLEN(in.ptr);
+	if (len < 1 || len > 4)
+	    return FALSE;
+	bytes = k5_input_get_bytes(&in, len);
+	if (bytes == NULL)
+	    return FALSE;
+	if (KRB5_UTF8_CHARLEN2(bytes, tmplen) != len)
+	    return FALSE;
+	for (i = 1; i < len; i++) {
+	    if ((bytes[i] & 0xc0) != 0x80)
+		return FALSE;
+	}
+    }
+    return !in.status;
+}
+
 #define TOUPPER(c)  (islower(c) ? toupper(c) : (c))
 #define TOLOWER(c)  (isupper(c) ? tolower(c) : (c))
 
_______________________________________________
cvs-krb5 mailing list
cvs-krb5@mit.edu
https://mailman.mit.edu/mailman/listinfo/cvs-krb5

home help back first fref pref prev next nref lref last post