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

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

krb5 commit: Use k5_ser_unpack_len() to simplify code

daemon@ATHENA.MIT.EDU (ghudson@mit.edu)
Sat May 16 18:37:12 2026

From: ghudson@mit.edu
To: cvs-krb5@mit.edu
Message-Id: <20260516223704.96A761054F5@krbdev.mit.edu>
Date: Sat, 16 May 2026 18:37:04 -0400 (EDT)
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/118f7da5ddd446a5efcedc8343b6c7aefef47742
commit 118f7da5ddd446a5efcedc8343b6c7aefef47742
Author: Greg Hudson <ghudson@mit.edu>
Date:   Wed May 13 22:44:48 2026 -0400

    Use k5_ser_unpack_len() to simplify code
    
    Export k5_ser_unpack_len() as a private symbol and use it in GSS
    context serialization.  Use it in libkrb5 to replace existing bounds
    checks.

 src/lib/gssapi/krb5/ser_sctx.c            | 37 +++++++++++--------------------
 src/lib/krb5/krb/ai_authdata.c            | 14 +++---------
 src/lib/krb5/krb/authdata.c               |  9 ++------
 src/lib/krb5_32.def                       |  6 ++++-
 src/plugins/authdata/greet_client/greet.c |  9 +++-----
 5 files changed, 26 insertions(+), 49 deletions(-)

diff --git a/src/lib/gssapi/krb5/ser_sctx.c b/src/lib/gssapi/krb5/ser_sctx.c
index 2e82be903..0c18f37b7 100644
--- a/src/lib/gssapi/krb5/ser_sctx.c
+++ b/src/lib/gssapi/krb5/ser_sctx.c
@@ -65,7 +65,7 @@ kg_oid_internalize(gss_OID *argp, krb5_octet **buffer, size_t *lenremain)
     gss_OID oid;
     krb5_int32 ibuf;
     krb5_octet         *bp;
-    size_t             remain;
+    size_t             remain, len;
 
     bp = *buffer;
     remain = *lenremain;
@@ -80,16 +80,12 @@ kg_oid_internalize(gss_OID *argp, krb5_octet **buffer, size_t *lenremain)
     oid = (gss_OID) malloc(sizeof(gss_OID_desc));
     if (oid == NULL)
         return ENOMEM;
-    if (krb5_ser_unpack_int32(&ibuf, &bp, &remain)) {
-        free(oid);
-        return EINVAL;
-    }
-    if (ibuf < 0 || (size_t)ibuf > remain) {
+    if (k5_ser_unpack_len(&len, &bp, &remain)) {
         free(oid);
         return EINVAL;
     }
-    oid->length = ibuf;
-    oid->elements = malloc((size_t)ibuf);
+    oid->length = len;
+    oid->elements = malloc(len);
     if (oid->elements == 0) {
         free(oid);
         return ENOMEM;
@@ -493,7 +489,7 @@ kg_ctx_internalize(krb5_context kcontext, krb5_gss_ctx_id_t *argp,
     krb5_gss_ctx_id_rec *ctx;
     krb5_int32          ibuf;
     krb5_octet          *bp;
-    size_t              remain;
+    size_t              remain, len, i;
     krb5int_access kaccess;
     krb5_principal        princ;
 
@@ -635,21 +631,14 @@ kg_ctx_internalize(krb5_context kcontext, krb5_gss_ctx_id_t *argp,
             ctx->cred_rcache = ibuf;
             /* authdata */
             if (!kret)
-                kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
-            if (!kret && (ibuf < 0 || (size_t)ibuf > remain))
-                kret = ENOMEM;
-            if (!kret) {
-                krb5_int32 nadata = ibuf, i;
-
-                if (nadata > 0) {
-                    ctx->authdata = (krb5_authdata **)calloc((size_t)nadata + 1,
-                                                             sizeof(krb5_authdata *));
-                    if (ctx->authdata == NULL) {
-                        kret = ENOMEM;
-                    } else {
-                        for (i = 0; !kret && i < nadata; i++)
-                            kret = k5_internalize_authdata(&ctx->authdata[i],
-                                                           &bp, &remain);
+                kret = k5_ser_unpack_len(&len, &bp, &remain);
+            if (!kret && len > 0) {
+                ctx->authdata = k5calloc(len + 1, sizeof(*ctx->authdata),
+                                         &kret);
+                if (ctx->authdata != NULL) {
+                    for (i = 0; !kret && i < len; i++) {
+                        kret = k5_internalize_authdata(&ctx->authdata[i],
+                                                       &bp, &remain);
                     }
                 }
             }
diff --git a/src/lib/krb5/krb/ai_authdata.c b/src/lib/krb5/krb/ai_authdata.c
index d3f671883..adcc780df 100644
--- a/src/lib/krb5/krb/ai_authdata.c
+++ b/src/lib/krb5/krb/ai_authdata.c
@@ -259,19 +259,15 @@ authind_internalize(krb5_context kcontext, krb5_authdata_context context,
 {
     struct authind_context *aictx = request_context;
     krb5_error_code ret;
-    int32_t count, len, i;
     uint8_t *bp = *buffer;
-    size_t remain = *lenremain;
+    size_t remain = *lenremain, len, count, i;
     krb5_data **inds = NULL;
 
     /* Get the count. */
-    ret = krb5_ser_unpack_int32(&count, &bp, &remain);
+    ret = k5_ser_unpack_len(&count, &bp, &remain);
     if (ret)
         return ret;
 
-    if (count < 0 || (size_t)count > remain)
-        return ERANGE;
-
     if (count > 0) {
         inds = k5calloc(count + 1, sizeof(*inds), &ret);
         if (inds == NULL)
@@ -280,13 +276,9 @@ authind_internalize(krb5_context kcontext, krb5_authdata_context context,
 
     for (i = 0; i < count; i++) {
         /* Get the length. */
-        ret = krb5_ser_unpack_int32(&len, &bp, &remain);
+        ret = k5_ser_unpack_len(&len, &bp, &remain);
         if (ret)
             goto cleanup;
-        if (len < 0 || (size_t)len > remain) {
-            ret = ERANGE;
-            goto cleanup;
-        }
 
         /* Get the indicator. */
         inds[i] = k5alloc(sizeof(*inds[i]), &ret);
diff --git a/src/lib/krb5/krb/authdata.c b/src/lib/krb5/krb/authdata.c
index 30c3d618d..733370cd7 100644
--- a/src/lib/krb5/krb/authdata.c
+++ b/src/lib/krb5/krb/authdata.c
@@ -326,18 +326,13 @@ k5_ad_internalize(krb5_context kcontext,
 
     for (i = 0; i < count; i++) {
         struct _krb5_authdata_context_module *module;
-        krb5_int32 namelen;
+        size_t namelen;
         krb5_data name;
 
-        code = krb5_ser_unpack_int32(&namelen, &bp, &remain);
+        code = k5_ser_unpack_len(&namelen, &bp, &remain);
         if (code != 0)
             break;
 
-        if (remain < (size_t)namelen) {
-            code = ENOMEM;
-            break;
-        }
-
         name.length = namelen;
         name.data = (char *)bp;
 
diff --git a/src/lib/krb5_32.def b/src/lib/krb5_32.def
index 23ad3f402..91f60a456 100644
--- a/src/lib/krb5_32.def
+++ b/src/lib/krb5_32.def
@@ -517,7 +517,11 @@ EXPORTS
 	encode_krb5_pkinit_supp_pub_info		@478 ; PRIVATE
 	krb5int_copy_data_contents			@479 ; PRIVATE
 	krb5_free_pa_data				@480 ; PRIVATE
-; private symbols new in 1.23, used by klist
+
+; new in 1.23
+; private symbols used by klist
 	k5_unwrap_cammac_svc				@481 ; PRIVATE
 	k5_authind_decode				@482 ; PRIVATE
 	k5_free_data_ptr_list				@483 ; PRIVATE
+; private symbol used by GSSAPI serialization
+	k5_ser_unpack_len				@484 ; PRIVATE
diff --git a/src/plugins/authdata/greet_client/greet.c b/src/plugins/authdata/greet_client/greet.c
index 3d1a9570c..778ce7c9f 100644
--- a/src/plugins/authdata/greet_client/greet.c
+++ b/src/plugins/authdata/greet_client/greet.c
@@ -335,22 +335,19 @@ greet_internalize(krb5_context kcontext,
 {
     struct greet_context *greet = (struct greet_context *)request_context;
     krb5_error_code code;
-    krb5_int32 length;
     krb5_octet *contents = NULL;
     krb5_int32 verified;
     krb5_int32 was_absent;
     krb5_octet *bp;
-    size_t remain;
+    size_t remain, length;
 
     bp = *buffer;
     remain = *lenremain;
 
     /* Greeting Length */
-    code = krb5_ser_unpack_int32(&length, &bp, &remain);
+    code = k5_ser_unpack_len(&length, &bp, &remain);
     if (code != 0)
         return code;
-    if (length < 0 || (size_t)length > remain)
-        return ENOMEM;
 
     /* Greeting Contents */
     if (length != 0) {
@@ -358,7 +355,7 @@ greet_internalize(krb5_context kcontext,
         if (contents == NULL)
             return ENOMEM;
 
-        code = krb5_ser_unpack_bytes(contents, (size_t)length, &bp, &remain);
+        code = krb5_ser_unpack_bytes(contents, length, &bp, &remain);
         if (code != 0) {
             free(contents);
             return code;
_______________________________________________
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