Blame SOURCES/Return-static-oids-for-naming-functions.patch

aa181f
From 0987e0e137854285d4022f5a910e7923d4e663fd Mon Sep 17 00:00:00 2001
aa181f
From: Simo Sorce <simo@redhat.com>
aa181f
Date: Thu, 27 Aug 2020 17:01:39 -0400
aa181f
Subject: [PATCH] Return static oids for naming functions
aa181f
aa181f
gss_display_name and gss_inquire_name reteurn "static" oids, that are
aa181f
generally not freed by callers, so make sure to match and return actual
aa181f
static OIDs exported by GSSAPI.
aa181f
aa181f
Also remove gpm_equal_oids() and use the library provided gss_oid_equal
aa181f
function instead.
aa181f
aa181f
Signed-off-by: Simo Sorce <simo@redhat.com>
aa181f
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
aa181f
(cherry picked from commit 6ea8391257e687dfb3981b634c06cf7a55008eb0)
aa181f
(cherry picked from commit 41cb9683627d6c3b136a4b48e1b1842619132f16)
aa181f
---
aa181f
 src/client/gpm_import_and_canon_name.c | 28 ++++++++++++++++++++++++--
aa181f
 src/client/gpm_indicate_mechs.c        | 24 +++++-----------------
aa181f
 src/client/gssapi_gpm.h                |  1 +
aa181f
 3 files changed, 32 insertions(+), 21 deletions(-)
aa181f
aa181f
diff --git a/src/client/gpm_import_and_canon_name.c b/src/client/gpm_import_and_canon_name.c
aa181f
index 70149a3..88b8d7c 100644
aa181f
--- a/src/client/gpm_import_and_canon_name.c
aa181f
+++ b/src/client/gpm_import_and_canon_name.c
aa181f
@@ -2,6 +2,26 @@
aa181f
 
aa181f
 #include "gssapi_gpm.h"
aa181f
 
aa181f
+static int gpm_name_oid_to_static(gss_OID name_type, gss_OID *name_static)
aa181f
+{
aa181f
+#define ret_static(b) \
aa181f
+    if (gss_oid_equal(name_type, b)) { \
aa181f
+        *name_static = b; \
aa181f
+        return 0; \
aa181f
+    }
aa181f
+    ret_static(GSS_C_NT_USER_NAME);
aa181f
+    ret_static(GSS_C_NT_MACHINE_UID_NAME);
aa181f
+    ret_static(GSS_C_NT_STRING_UID_NAME);
aa181f
+    ret_static(GSS_C_NT_HOSTBASED_SERVICE_X);
aa181f
+    ret_static(GSS_C_NT_HOSTBASED_SERVICE);
aa181f
+    ret_static(GSS_C_NT_ANONYMOUS);
aa181f
+    ret_static(GSS_C_NT_EXPORT_NAME);
aa181f
+    ret_static(GSS_C_NT_COMPOSITE_EXPORT);
aa181f
+    ret_static(GSS_KRB5_NT_PRINCIPAL_NAME);
aa181f
+    ret_static(gss_nt_krb5_name);
aa181f
+    return ENOENT;
aa181f
+}
aa181f
+
aa181f
 OM_uint32 gpm_display_name(OM_uint32 *minor_status,
aa181f
                            gssx_name *in_name,
aa181f
                            gss_buffer_t output_name_buffer,
aa181f
@@ -57,7 +77,9 @@ OM_uint32 gpm_display_name(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     if (output_name_type) {
aa181f
-        ret = gp_conv_gssx_to_oid_alloc(&in_name->name_type, output_name_type);
aa181f
+        gss_OID_desc oid;
aa181f
+        gp_conv_gssx_to_oid(&in_name->name_type, &oid;;
aa181f
+        ret = gpm_name_oid_to_static(&oid, output_name_type);
aa181f
         if (ret) {
aa181f
             gss_release_buffer(&discard, output_name_buffer);
aa181f
             ret_min = ret;
aa181f
@@ -285,7 +307,9 @@ OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     if (MN_mech != NULL) {
aa181f
-        ret = gp_conv_gssx_to_oid_alloc(&name->name_type, MN_mech);
aa181f
+        gss_OID_desc oid;
aa181f
+        gp_conv_gssx_to_oid(&name->name_type, &oid;;
aa181f
+        ret = gpm_name_oid_to_static(&oid, MN_mech);
aa181f
         if (ret) {
aa181f
             *minor_status = ret;
aa181f
             return GSS_S_FAILURE;
aa181f
diff --git a/src/client/gpm_indicate_mechs.c b/src/client/gpm_indicate_mechs.c
aa181f
index 86c7de3..4041dcd 100644
aa181f
--- a/src/client/gpm_indicate_mechs.c
aa181f
+++ b/src/client/gpm_indicate_mechs.c
aa181f
@@ -95,20 +95,6 @@ static uint32_t gpm_copy_gss_buffer(uint32_t *minor_status,
aa181f
     return GSS_S_COMPLETE;
aa181f
 }
aa181f
 
aa181f
-static bool gpm_equal_oids(gss_const_OID a, gss_const_OID b)
aa181f
-{
aa181f
-    int ret;
aa181f
-
aa181f
-    if (a->length == b->length) {
aa181f
-        ret = memcmp(a->elements, b->elements, a->length);
aa181f
-        if (ret == 0) {
aa181f
-            return true;
aa181f
-        }
aa181f
-    }
aa181f
-
aa181f
-    return false;
aa181f
-}
aa181f
-
aa181f
 static void gpmint_indicate_mechs(void)
aa181f
 {
aa181f
     union gp_rpc_arg uarg;
aa181f
@@ -313,7 +299,7 @@ int gpm_mech_to_static(gss_OID mech_type, gss_OID *mech_static)
aa181f
 
aa181f
     *mech_static = GSS_C_NO_OID;
aa181f
     for (size_t i = 0; i < global_mechs.mech_set->count; i++) {
aa181f
-        if (gpm_equal_oids(&global_mechs.mech_set->elements[i], mech_type)) {
aa181f
+        if (gss_oid_equal(&global_mechs.mech_set->elements[i], mech_type)) {
aa181f
             *mech_static = &global_mechs.mech_set->elements[i];
aa181f
             return 0;
aa181f
         }
aa181f
@@ -383,7 +369,7 @@ OM_uint32 gpm_inquire_names_for_mech(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     for (unsigned i = 0; i < global_mechs.info_len; i++) {
aa181f
-        if (!gpm_equal_oids(global_mechs.info[i].mech, mech_type)) {
aa181f
+        if (!gss_oid_equal(global_mechs.info[i].mech, mech_type)) {
aa181f
             continue;
aa181f
         }
aa181f
         ret_maj = gpm_copy_gss_OID_set(&ret_min,
aa181f
@@ -481,7 +467,7 @@ OM_uint32 gpm_inquire_attrs_for_mech(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     for (unsigned i = 0; i < global_mechs.info_len; i++) {
aa181f
-        if (!gpm_equal_oids(global_mechs.info[i].mech, mech)) {
aa181f
+        if (!gss_oid_equal(global_mechs.info[i].mech, mech)) {
aa181f
             continue;
aa181f
         }
aa181f
 
aa181f
@@ -540,7 +526,7 @@ OM_uint32 gpm_inquire_saslname_for_mech(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     for (unsigned i = 0; i < global_mechs.info_len; i++) {
aa181f
-        if (!gpm_equal_oids(global_mechs.info[i].mech, desired_mech)) {
aa181f
+        if (!gss_oid_equal(global_mechs.info[i].mech, desired_mech)) {
aa181f
             continue;
aa181f
         }
aa181f
         ret_maj = gpm_copy_gss_buffer(&ret_min,
aa181f
@@ -598,7 +584,7 @@ OM_uint32 gpm_display_mech_attr(OM_uint32 *minor_status,
aa181f
     }
aa181f
 
aa181f
     for (unsigned i = 0; i < global_mechs.desc_len; i++) {
aa181f
-        if (!gpm_equal_oids(global_mechs.desc[i].attr, mech_attr)) {
aa181f
+        if (!gss_oid_equal(global_mechs.desc[i].attr, mech_attr)) {
aa181f
             continue;
aa181f
         }
aa181f
         ret_maj = gpm_copy_gss_buffer(&ret_min,
aa181f
diff --git a/src/client/gssapi_gpm.h b/src/client/gssapi_gpm.h
aa181f
index b7ba04b..bdf12e1 100644
aa181f
--- a/src/client/gssapi_gpm.h
aa181f
+++ b/src/client/gssapi_gpm.h
aa181f
@@ -10,6 +10,7 @@
aa181f
 #include <string.h>
aa181f
 #include <gssapi/gssapi.h>
aa181f
 #include <gssapi/gssapi_ext.h>
aa181f
+#include <gssapi/gssapi_krb5.h>
aa181f
 #include "rpcgen/gp_rpc.h"
aa181f
 #include "rpcgen/gss_proxy.h"
aa181f
 #include "src/gp_common.h"