]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Improve argument validation in some GSS APIs 988/head
authorGreg Hudson <ghudson@mit.edu>
Thu, 17 Oct 2019 04:52:04 +0000 (00:52 -0400)
committerGreg Hudson <ghudson@mit.edu>
Mon, 21 Oct 2019 22:23:39 +0000 (18:23 -0400)
The prevailing discpline of public GSS APIs is to set output
parameters to default values, then validate input parameters.  Some
more recent APIs did not do this consistently, leading to the
possibility of minor_status retaining its previous value or similar
issues.

19 files changed:
src/lib/gssapi/generic/gssapi_generic.c
src/lib/gssapi/mechglue/g_authorize_localname.c
src/lib/gssapi/mechglue/g_complete_auth_token.c
src/lib/gssapi/mechglue/g_del_name_attr.c
src/lib/gssapi/mechglue/g_export_name_comp.c
src/lib/gssapi/mechglue/g_get_name_attr.c
src/lib/gssapi/mechglue/g_initialize.c
src/lib/gssapi/mechglue/g_inq_context_oid.c
src/lib/gssapi/mechglue/g_inq_cred_oid.c
src/lib/gssapi/mechglue/g_inq_name.c
src/lib/gssapi/mechglue/g_map_name_to_any.c
src/lib/gssapi/mechglue/g_mechattr.c
src/lib/gssapi/mechglue/g_prf.c
src/lib/gssapi/mechglue/g_rel_name_mapping.c
src/lib/gssapi/mechglue/g_saslname.c
src/lib/gssapi/mechglue/g_set_context_option.c
src/lib/gssapi/mechglue/g_set_cred_option.c
src/lib/gssapi/mechglue/g_set_name_attr.c
src/lib/gssapi/mechglue/g_set_neg_mechs.c

index fa144c2bf9ccff910112c862f1c755290409e770..1b362c3d8bd6162b7d1017a349f6119320c26c09 100644 (file)
@@ -413,6 +413,8 @@ generic_gss_display_mech_attr(
 {
     size_t i;
 
+    if (minor_status != NULL)
+        *minor_status = 0;
     if (name != GSS_C_NO_BUFFER) {
         name->length = 0;
         name->value = NULL;
@@ -425,6 +427,8 @@ generic_gss_display_mech_attr(
         long_desc->length = 0;
         long_desc->value = NULL;
     }
+    if (minor_status == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
     for (i = 0; i < sizeof(mech_attr_info)/sizeof(mech_attr_info[0]); i++) {
         struct mech_attr_info_desc *mai = &mech_attr_info[i];
 
index 0e4fb072292460957215e2aa1eaac15ffde6d876..b6fc54da8dd7dc436262a7b88045007ca3d0c2ce 100644 (file)
@@ -169,12 +169,11 @@ gss_authorize_localname(OM_uint32 *minor,
 
        if (minor == NULL)
                return (GSS_S_CALL_INACCESSIBLE_WRITE);
+       *minor = 0;
 
        if (name == GSS_C_NO_NAME || user == GSS_C_NO_NAME)
                return (GSS_S_CALL_INACCESSIBLE_READ);
 
-       *minor = 0;
-
        unionName = (gss_union_name_t)name;
        unionUser = (gss_union_name_t)user;
 
index 4bcb47e84b90e41218c82ae2ea698388f1373958..4f028a77ee3a0f80e575ec72dfc73d14b7a644db 100644 (file)
@@ -43,6 +43,11 @@ gss_complete_auth_token (OM_uint32 *minor_status,
     gss_union_ctx_id_t ctx;
     gss_mechanism      mech;
 
+    if (minor_status == NULL)
+       return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
+    if (input_message_buffer == GSS_C_NO_BUFFER)
+       return GSS_S_CALL_INACCESSIBLE_READ;
     if (context_handle == GSS_C_NO_CONTEXT)
        return GSS_S_NO_CONTEXT;
 
index e81e3315ade4052747e6b1df121bfe0dd3992a7e..21f156813e63b3df4814e95608cb9a68eb2e0570 100644 (file)
@@ -38,12 +38,11 @@ gss_delete_name_attribute(OM_uint32 *minor_status,
 
     if (minor_status == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (name == GSS_C_NO_NAME)
         return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
 
-    *minor_status = 0;
-
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID)
index ab538a095d6afdc0107fa6c18e38ead8fbfb3f72..0a2bac41fb727defa4f270b1d575be1308feb776 100644 (file)
@@ -39,6 +39,14 @@ gss_export_name_composite(OM_uint32 *minor_status,
     gss_union_name_t    union_name;
     gss_mechanism       mech;
 
+    if (minor_status != NULL)
+        *minor_status = 0;
+
+    if (exp_composite_name != GSS_C_NO_BUFFER) {
+        exp_composite_name->value = NULL;
+        exp_composite_name->length = 0;
+    }
+
     if (minor_status == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
 
@@ -48,8 +56,6 @@ gss_export_name_composite(OM_uint32 *minor_status,
     if (exp_composite_name == GSS_C_NO_BUFFER)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
 
-    *minor_status = 0;
-
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID)
index 047d5d428fb03b69584abd5680bee462c17d211f..2108beb3611671d41788c1af3e8a8be6bf195d41 100644 (file)
@@ -41,16 +41,8 @@ gss_get_name_attribute(OM_uint32 *minor_status,
     gss_union_name_t    union_name;
     gss_mechanism       mech;
 
-    if (minor_status == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
-    if (name == GSS_C_NO_NAME)
-        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
-    if (attr == GSS_C_NO_BUFFER)
-        return GSS_S_CALL_INACCESSIBLE_READ;
-    if (more == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
+    if (minor_status != NULL)
+        *minor_status = 0;
     if (authenticated != NULL)
         *authenticated = 0;
     if (complete != NULL)
@@ -64,7 +56,15 @@ gss_get_name_attribute(OM_uint32 *minor_status,
         display_value->length = 0;
     }
 
-    *minor_status = 0;
+    if (minor_status == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
+
+    if (name == GSS_C_NO_NAME)
+        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
+    if (attr == GSS_C_NO_BUFFER)
+        return GSS_S_CALL_INACCESSIBLE_READ;
+    if (more == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
     union_name = (gss_union_name_t)name;
 
index 0054acf88ed5db93d2204671921f8fb9dfd99fe7..120d73e2f20ba9d2e7b6a80d18ec51d6ae2de924 100644 (file)
@@ -168,6 +168,9 @@ gss_OID *oid;
        OM_uint32 major;
        gss_mech_info aMech;
 
+       if (minor_status != NULL)
+           *minor_status = 0;
+
        if (minor_status == NULL || oid == NULL)
                return (GSS_S_CALL_INACCESSIBLE_WRITE);
 
index ebdeaaee88b2f54c0e43ef83cb18036be958d63f..d375cfc7959478dd265c6a927690d56dd457fedf 100644 (file)
@@ -36,7 +36,13 @@ gss_inquire_sec_context_by_oid (OM_uint32 *minor_status,
     gss_union_ctx_id_t ctx;
     gss_mechanism      mech;
 
-    if (minor_status == NULL)
+    if (minor_status != NULL)
+       *minor_status = 0;
+
+    if (data_set != NULL)
+       *data_set = GSS_C_NO_BUFFER_SET;
+
+    if (minor_status == NULL || data_set == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
     if (context_handle == GSS_C_NO_CONTEXT)
index df51b44e9a5b91165949e6c6c7190fb5384f3a3a..6d8594d1bbddd069b4790beaee33406a2d80cc55 100644 (file)
@@ -74,14 +74,20 @@ gss_inquire_cred_by_oid(OM_uint32 *minor_status,
     gss_buffer_set_t   ret_set = GSS_C_NO_BUFFER_SET;
     OM_uint32          status, minor;
 
-    if (minor_status == NULL)
+    if (minor_status != NULL)
+       *minor_status = 0;
+
+    if (data_set != NULL)
+       *data_set = GSS_C_NO_BUFFER_SET;
+
+    if (minor_status == NULL || data_set == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
     if (cred_handle == GSS_C_NO_CREDENTIAL)
        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CRED;
 
-    *minor_status = 0;
-    *data_set = GSS_C_NO_BUFFER_SET;
+    if (desired_object == GSS_C_NO_OID)
+       return GSS_S_CALL_INACCESSIBLE_READ;
 
     union_cred = (gss_union_cred_t) cred_handle;
 
index 60a3b54e79900b84eba4feb6e90870b05486857b..cd1cbe5d905ba2cfb95085b25f867f19722d0796 100644 (file)
@@ -38,11 +38,8 @@ gss_inquire_name(OM_uint32 *minor_status,
     gss_union_name_t    union_name;
     gss_mechanism       mech;
 
-    if (minor_status == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
-    if (name == GSS_C_NO_NAME)
-        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
+    if (minor_status != NULL)
+        *minor_status = 0;
 
     if (MN_mech != NULL)
         *MN_mech = GSS_C_NO_OID;
@@ -50,7 +47,12 @@ gss_inquire_name(OM_uint32 *minor_status,
     if (attrs != NULL)
         *attrs = GSS_C_NO_BUFFER_SET;
 
-    *minor_status = 0;
+    if (minor_status == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
+
+    if (name == GSS_C_NO_NAME)
+        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
+
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID) {
index ebf49450f06267b8e8d552bb790172f59bfc4d2a..0e5490bea951a833df56f8e024a3386da3a8f09e 100644 (file)
@@ -38,7 +38,13 @@ gss_map_name_to_any(OM_uint32 *minor_status,
     gss_union_name_t    union_name;
     gss_mechanism       mech;
 
-    if (minor_status == NULL)
+    if (minor_status != NULL)
+        *minor_status = 0;
+
+    if (output != NULL)
+        *output = NULL;
+
+    if (minor_status == NULL || output == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
 
     if (name == GSS_C_NO_NAME)
@@ -47,11 +53,6 @@ gss_map_name_to_any(OM_uint32 *minor_status,
     if (type_id == GSS_C_NO_BUFFER)
         return GSS_S_CALL_INACCESSIBLE_READ;
 
-    if (output == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
-    *minor_status = 0;
-
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID)
index e49651eb6ade429172284b833f51cea4755649d1..5d3e3f18cee1b6d4b347cd0bc331865ed9e45ce5 100644 (file)
@@ -100,16 +100,15 @@ gss_indicate_mechs_by_attrs(
     gss_OID_set     allMechs = GSS_C_NO_OID_SET;
     size_t          i;
 
-    if (minor == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
+    if (minor != NULL)
+        *minor = 0;
 
-    *minor = 0;
+    if (mechs != NULL)
+        *mechs = GSS_C_NO_OID_SET;
 
-    if (mechs == NULL)
+    if (minor == NULL || mechs == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
 
-    *mechs = GSS_C_NO_OID_SET;
-
     status = gss_indicate_mechs(minor, &allMechs);
     if (GSS_ERROR(status))
         goto cleanup;
@@ -163,10 +162,8 @@ gss_inquire_attrs_for_mech(
     gss_OID         selected_mech, public_mech;
     gss_mechanism   mech;
 
-    if (minor == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
-    *minor = 0;
+    if (minor != NULL)
+        *minor = 0;
 
     if (mech_attrs != NULL)
         *mech_attrs = GSS_C_NO_OID_SET;
@@ -174,6 +171,9 @@ gss_inquire_attrs_for_mech(
     if (known_mech_attrs != NULL)
         *known_mech_attrs = GSS_C_NO_OID_SET;
 
+    if (minor == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
+
     status = gssint_select_mech_type(minor, mech_oid, &selected_mech);
     if (status != GSS_S_COMPLETE)
         return status;
index 9e168adfe0d620bb6deb4454b5f699677b08f593..96f2facf8934914cfb0c47b3488638a623cc1001 100644 (file)
@@ -38,6 +38,14 @@ gss_pseudo_random (OM_uint32 *minor_status,
     gss_union_ctx_id_t ctx;
     gss_mechanism      mech;
 
+    if (minor_status != NULL)
+       *minor_status = 0;
+
+    if (prf_out != GSS_C_NO_BUFFER) {
+       prf_out->length = 0;
+       prf_out->value = NULL;
+    }
+
     if (minor_status == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
@@ -45,10 +53,10 @@ gss_pseudo_random (OM_uint32 *minor_status,
        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT;
 
     if (prf_in == GSS_C_NO_BUFFER)
-       return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT;
+       return GSS_S_CALL_INACCESSIBLE_READ;
 
     if (prf_out == GSS_C_NO_BUFFER)
-       return GSS_S_CALL_INACCESSIBLE_WRITE | GSS_S_NO_CONTEXT;
+       return GSS_S_CALL_INACCESSIBLE_WRITE;
 
     prf_out->length = 0;
     prf_out->value = NULL;
index f09136afee7439afd07b071c7d64f76249ee3bed..03631782737556a96932b891d764aae4815c0889 100644 (file)
@@ -39,6 +39,7 @@ gss_release_any_name_mapping(OM_uint32 *minor_status,
 
     if (minor_status == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (name == GSS_C_NO_NAME)
         return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
@@ -49,8 +50,6 @@ gss_release_any_name_mapping(OM_uint32 *minor_status,
     if (input == NULL)
         return GSS_S_CALL_INACCESSIBLE_READ;
 
-    *minor_status = 0;
-
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID)
index 48060c36717200fa77ffeefa4294596e5b8a1ec4..e25f9e0a5363c0aa7d7cb5a601a03a5ab679f790 100644 (file)
@@ -177,14 +177,15 @@ OM_uint32 KRB5_CALLCONV gss_inquire_mech_for_saslname(
     gss_OID_set     mechSet = GSS_C_NO_OID_SET;
     size_t          i;
 
-    if (minor_status == NULL)
-        return GSS_S_CALL_INACCESSIBLE_WRITE;
-
-    *minor_status = 0;
+    if (minor_status != NULL)
+        *minor_status = 0;
 
     if (mech_type != NULL)
         *mech_type = GSS_C_NO_OID;
 
+    if (minor_status == NULL)
+        return GSS_S_CALL_INACCESSIBLE_WRITE;
+
     status = gss_indicate_mechs(minor_status, &mechSet);
     if (status != GSS_S_COMPLETE)
         return status;
index 87db240df3dbaf5049bd752f5de9d3cb7ee5f780..8e25a277f8fcabc0339a28863ba4e163daeb70da 100644 (file)
@@ -44,12 +44,11 @@ gss_set_sec_context_option (OM_uint32 *minor_status,
 
     if (minor_status == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (context_handle == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
-    *minor_status = 0;
-
     /*
      * select the approprate underlying mechanism routine and
      * call it.
index 90e5756e51996d0ed8d0fc7629a85a8d6d0aefd4..5c9d21dbc1d3c512c84de7c7be0be426c5779b50 100644 (file)
@@ -103,12 +103,11 @@ gss_set_cred_option(OM_uint32 *minor_status,
 
     if (minor_status == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (cred_handle == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
 
-    *minor_status = 0;
-
     status = GSS_S_UNAVAILABLE;
 
     if (*cred_handle == GSS_C_NO_CREDENTIAL) {
index a479762a76097881a3f122fbb95063326ca1ebfa..42bde490c5455731cd5500928fed679a360ada35 100644 (file)
@@ -40,12 +40,11 @@ gss_set_name_attribute(OM_uint32 *minor_status,
 
     if (minor_status == NULL)
         return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (name == GSS_C_NO_NAME)
         return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME;
 
-    *minor_status = 0;
-
     union_name = (gss_union_name_t)name;
 
     if (union_name->mech_type == GSS_C_NO_OID)
index 69cac7037334ff7532528e00fb8e68e3c96f968c..9b04ec9d0e8252d45e2b3d277d80a03a0fbb4d1b 100644 (file)
@@ -37,12 +37,11 @@ gss_set_neg_mechs(OM_uint32 *minor_status,
 
     if (minor_status == NULL)
        return GSS_S_CALL_INACCESSIBLE_WRITE;
+    *minor_status = 0;
 
     if (cred_handle == GSS_C_NO_CREDENTIAL)
        return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CRED;
 
-    *minor_status = 0;
-
     union_cred = (gss_union_cred_t) cred_handle;
 
     avail = 0;