David Woodhouse
2016-03-14 20:12:37 UTC
Since commit 030a4a03a ("Report inquire_attrs_For_mech mech failures")
the GSS-NTLMSSP plugin fails to work, because it doesn't provide a
gss_inquire_attrs_for_mech() method.
Sure, it can be fixed. But why do we need to break it? Isn't it
perfectly reasonable to assume that the answer is GSS_C_NO_OID_SET?
diff --git a/src/lib/gssapi/mechglue/g_mechattr.c b/src/lib/gssapi/mechglue/g_mechattr.c
index 08a6008..aa06319 100644
--- a/src/lib/gssapi/mechglue/g_mechattr.c
+++ b/src/lib/gssapi/mechglue/g_mechattr.c
@@ -181,14 +181,16 @@ gss_inquire_attrs_for_mech(
     mech = gssint_get_mechanism(selected_mech);
     if (mech == NULL)
         return GSS_S_BAD_MECH;
-Â Â Â Â else if (mech->gss_inquire_attrs_for_mech == NULL)
-Â Â Â Â Â Â Â Â return GSS_S_UNAVAILABLE;
-Â Â Â Â public_mech = gssint_get_public_oid(selected_mech);
-Â Â Â Â status = mech->gss_inquire_attrs_for_mech(minor, public_mech, mech_attrs,
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â known_mech_attrs);
-Â Â Â Â if (GSS_ERROR(status)) {
-Â Â Â Â Â Â Â Â map_error(minor, mech);
-Â Â Â Â Â Â Â Â return status;
+
+Â Â Â Â if (mech->gss_inquire_attrs_for_mech != NULL) {
+Â Â Â Â Â Â Â Â public_mech = gssint_get_public_oid(selected_mech);
+Â Â Â Â Â Â Â Â status = mech->gss_inquire_attrs_for_mech(minor, public_mech,
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â mech_attrs,
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â known_mech_attrs);
+Â Â Â Â Â Â Â Â if (GSS_ERROR(status)) {
+Â Â Â Â Â Â Â Â Â Â Â Â map_error(minor, mech);
+Â Â Â Â Â Â Â Â Â Â Â Â return status;
+Â Â Â Â Â Â Â Â }
     }
Â
     if (known_mech_attrs != NULL && *known_mech_attrs == GSS_C_NO_OID_SET) {
the GSS-NTLMSSP plugin fails to work, because it doesn't provide a
gss_inquire_attrs_for_mech() method.
Sure, it can be fixed. But why do we need to break it? Isn't it
perfectly reasonable to assume that the answer is GSS_C_NO_OID_SET?
diff --git a/src/lib/gssapi/mechglue/g_mechattr.c b/src/lib/gssapi/mechglue/g_mechattr.c
index 08a6008..aa06319 100644
--- a/src/lib/gssapi/mechglue/g_mechattr.c
+++ b/src/lib/gssapi/mechglue/g_mechattr.c
@@ -181,14 +181,16 @@ gss_inquire_attrs_for_mech(
     mech = gssint_get_mechanism(selected_mech);
     if (mech == NULL)
         return GSS_S_BAD_MECH;
-Â Â Â Â else if (mech->gss_inquire_attrs_for_mech == NULL)
-Â Â Â Â Â Â Â Â return GSS_S_UNAVAILABLE;
-Â Â Â Â public_mech = gssint_get_public_oid(selected_mech);
-Â Â Â Â status = mech->gss_inquire_attrs_for_mech(minor, public_mech, mech_attrs,
-Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â known_mech_attrs);
-Â Â Â Â if (GSS_ERROR(status)) {
-Â Â Â Â Â Â Â Â map_error(minor, mech);
-Â Â Â Â Â Â Â Â return status;
+
+Â Â Â Â if (mech->gss_inquire_attrs_for_mech != NULL) {
+Â Â Â Â Â Â Â Â public_mech = gssint_get_public_oid(selected_mech);
+Â Â Â Â Â Â Â Â status = mech->gss_inquire_attrs_for_mech(minor, public_mech,
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â mech_attrs,
+Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â known_mech_attrs);
+Â Â Â Â Â Â Â Â if (GSS_ERROR(status)) {
+Â Â Â Â Â Â Â Â Â Â Â Â map_error(minor, mech);
+Â Â Â Â Â Â Â Â Â Â Â Â return status;
+Â Â Â Â Â Â Â Â }
     }
Â
     if (known_mech_attrs != NULL && *known_mech_attrs == GSS_C_NO_OID_SET) {
--
David Woodhouse Open Source Technology Centre
***@intel.com Intel Corporation
David Woodhouse Open Source Technology Centre
***@intel.com Intel Corporation