Blame SOURCES/0001-Fix-SASL-get-set-options-on-big-endian-platforms.patch

2b15d0
From 30fb0a8bda8fbedc22de87b21b8b1b64de310a6b Mon Sep 17 00:00:00 2001
2b15d0
From: Christian Heimes <cheimes@redhat.com>
2b15d0
Date: Mon, 28 Jun 2021 11:03:02 +0200
2b15d0
Subject: [PATCH] Fix SASL get/set options on big endian platforms
2b15d0
2b15d0
The options OPT_X_SASL_SSF_MIN, OPT_X_SASL_SSF_MAX, and OPT_X_SASL_SSF
2b15d0
take *ber_len_t as input and output arguments. ber_len_t is defined as
2b15d0
unsigned long:
2b15d0
2b15d0
```
2b15d0
    /* LBER lengths (32 bits or larger) */
2b15d0
    #define LBER_LEN_T long
2b15d0
2b15d0
    typedef unsigned LBER_LEN_T ber_len_t;
2b15d0
```
2b15d0
2b15d0
Wrong type handling is causing issues on big endian platforms.
2b15d0
2b15d0
Signed-off-by: Christian Heimes <cheimes@redhat.com>
2b15d0
---
2b15d0
 Modules/options.c     | 41 ++++++++++++++++++++++++++++++-----------
2b15d0
 Tests/t_ldapobject.py | 23 ++++++++++++++++++++++-
2b15d0
 2 files changed, 52 insertions(+), 12 deletions(-)
2b15d0
2b15d0
diff --git a/Modules/options.c b/Modules/options.c
2b15d0
index 549a672..67511e8 100644
2b15d0
--- a/Modules/options.c
2b15d0
+++ b/Modules/options.c
2b15d0
@@ -43,6 +43,10 @@ LDAP_set_option(LDAPObject *self, int option, PyObject *value)
2b15d0
     double doubleval;
2b15d0
     char *strval;
2b15d0
     struct timeval tv;
2b15d0
+#if HAVE_SASL
2b15d0
+    /* unsigned long */
2b15d0
+    ber_len_t blen;
2b15d0
+#endif
2b15d0
     void *ptr;
2b15d0
     LDAP *ld;
2b15d0
     LDAPControl **controls = NULL;
2b15d0
@@ -89,10 +93,6 @@ LDAP_set_option(LDAPObject *self, int option, PyObject *value)
2b15d0
     case LDAP_OPT_X_TLS_PROTOCOL_MIN:
2b15d0
 #endif
2b15d0
 #endif
2b15d0
-#ifdef HAVE_SASL
2b15d0
-    case LDAP_OPT_X_SASL_SSF_MIN:
2b15d0
-    case LDAP_OPT_X_SASL_SSF_MAX:
2b15d0
-#endif
2b15d0
 #ifdef LDAP_OPT_X_KEEPALIVE_IDLE
2b15d0
     case LDAP_OPT_X_KEEPALIVE_IDLE:
2b15d0
 #endif
2b15d0
@@ -108,6 +108,16 @@ LDAP_set_option(LDAPObject *self, int option, PyObject *value)
2b15d0
             return 0;
2b15d0
         ptr = &intval;
2b15d0
         break;
2b15d0
+
2b15d0
+#ifdef HAVE_SASL
2b15d0
+    case LDAP_OPT_X_SASL_SSF_MIN:
2b15d0
+    case LDAP_OPT_X_SASL_SSF_MAX:
2b15d0
+        if (!PyArg_Parse(value, "k:set_option", &blen))
2b15d0
+            return 0;
2b15d0
+        ptr = &ble;;
2b15d0
+        break;
2b15d0
+#endif
2b15d0
+
2b15d0
     case LDAP_OPT_HOST_NAME:
2b15d0
     case LDAP_OPT_URI:
2b15d0
 #ifdef LDAP_OPT_DEFBASE
2b15d0
@@ -135,6 +145,7 @@ LDAP_set_option(LDAPObject *self, int option, PyObject *value)
2b15d0
             return 0;
2b15d0
         ptr = strval;
2b15d0
         break;
2b15d0
+
2b15d0
     case LDAP_OPT_TIMEOUT:
2b15d0
     case LDAP_OPT_NETWORK_TIMEOUT:
2b15d0
         /* Float valued timeval options */
2b15d0
@@ -239,6 +250,10 @@ LDAP_get_option(LDAPObject *self, int option)
2b15d0
     LDAPAPIInfo apiinfo;
2b15d0
     LDAPControl **lcs;
2b15d0
     char *strval;
2b15d0
+#if HAVE_SASL
2b15d0
+    /* unsigned long */
2b15d0
+    ber_len_t blen;
2b15d0
+#endif
2b15d0
     PyObject *extensions, *v;
2b15d0
     Py_ssize_t i, num_extensions;
2b15d0
 
2b15d0
@@ -277,9 +292,6 @@ LDAP_get_option(LDAPObject *self, int option)
2b15d0
 
2b15d0
         return v;
2b15d0
 
2b15d0
-#ifdef HAVE_SASL
2b15d0
-    case LDAP_OPT_X_SASL_SSF:
2b15d0
-#endif
2b15d0
     case LDAP_OPT_REFERRALS:
2b15d0
     case LDAP_OPT_RESTART:
2b15d0
     case LDAP_OPT_DEREF:
2b15d0
@@ -299,10 +311,6 @@ LDAP_get_option(LDAPObject *self, int option)
2b15d0
     case LDAP_OPT_X_TLS_PROTOCOL_MIN:
2b15d0
 #endif
2b15d0
 #endif
2b15d0
-#ifdef HAVE_SASL
2b15d0
-    case LDAP_OPT_X_SASL_SSF_MIN:
2b15d0
-    case LDAP_OPT_X_SASL_SSF_MAX:
2b15d0
-#endif
2b15d0
 #ifdef LDAP_OPT_X_SASL_NOCANON
2b15d0
     case LDAP_OPT_X_SASL_NOCANON:
2b15d0
 #endif
2b15d0
@@ -324,6 +332,17 @@ LDAP_get_option(LDAPObject *self, int option)
2b15d0
             return option_error(res, "ldap_get_option");
2b15d0
         return PyInt_FromLong(intval);
2b15d0
 
2b15d0
+#ifdef HAVE_SASL
2b15d0
+    case LDAP_OPT_X_SASL_SSF:
2b15d0
+    case LDAP_OPT_X_SASL_SSF_MIN:
2b15d0
+    case LDAP_OPT_X_SASL_SSF_MAX:
2b15d0
+#endif
2b15d0
+        /* ber_len_t options (unsigned long)*/
2b15d0
+        res = LDAP_int_get_option(self, option, &blen);
2b15d0
+        if (res != LDAP_OPT_SUCCESS)
2b15d0
+            return option_error(res, "ldap_get_option");
2b15d0
+        return PyLong_FromUnsignedLong(blen);
2b15d0
+
2b15d0
     case LDAP_OPT_HOST_NAME:
2b15d0
     case LDAP_OPT_URI:
2b15d0
 #ifdef LDAP_OPT_DEFBASE
2b15d0
diff --git a/Tests/t_ldapobject.py b/Tests/t_ldapobject.py
2b15d0
index e54bbfd..0a089c9 100644
2b15d0
--- a/Tests/t_ldapobject.py
2b15d0
+++ b/Tests/t_ldapobject.py
2b15d0
@@ -334,7 +334,7 @@ class Test00_SimpleLDAPObject(SlapdTestCase):
2b15d0
 
2b15d0
     @requires_sasl()
2b15d0
     @requires_ldapi()
2b15d0
-    def test006_sasl_extenal_bind_s(self):
2b15d0
+    def test006_sasl_external_bind_s(self):
2b15d0
         l = self.ldap_object_class(self.server.ldapi_uri)
2b15d0
         l.sasl_external_bind_s()
2b15d0
         self.assertEqual(l.whoami_s(), 'dn:'+self.server.root_dn.lower())
2b15d0
@@ -343,6 +343,27 @@ class Test00_SimpleLDAPObject(SlapdTestCase):
2b15d0
         l.sasl_external_bind_s(authz_id=authz_id)
2b15d0
         self.assertEqual(l.whoami_s(), authz_id.lower())
2b15d0
 
2b15d0
+    @requires_sasl()
2b15d0
+    @requires_ldapi()
2b15d0
+    def test006_sasl_options(self):
2b15d0
+        l = self.ldap_object_class(self.server.ldapi_uri)
2b15d0
+
2b15d0
+        minssf = l.get_option(ldap.OPT_X_SASL_SSF_MIN)
2b15d0
+        self.assertGreaterEqual(minssf, 0)
2b15d0
+        self.assertLessEqual(minssf, 256)
2b15d0
+        maxssf = l.get_option(ldap.OPT_X_SASL_SSF_MAX)
2b15d0
+        self.assertGreaterEqual(maxssf, 0)
2b15d0
+        # libldap sets SSF_MAX to INT_MAX
2b15d0
+        self.assertLessEqual(maxssf, 2**31 - 1)
2b15d0
+
2b15d0
+        l.set_option(ldap.OPT_X_SASL_SSF_MIN, 56)
2b15d0
+        l.set_option(ldap.OPT_X_SASL_SSF_MAX, 256)
2b15d0
+        self.assertEqual(l.get_option(ldap.OPT_X_SASL_SSF_MIN), 56)
2b15d0
+        self.assertEqual(l.get_option(ldap.OPT_X_SASL_SSF_MAX), 256)
2b15d0
+
2b15d0
+        l.sasl_external_bind_s()
2b15d0
+        self.assertEqual(l.whoami_s(), 'dn:' + self.server.root_dn.lower())
2b15d0
+
2b15d0
     def test007_timeout(self):
2b15d0
         l = self.ldap_object_class(self.server.ldap_uri)
2b15d0
         m = l.search_ext(self.server.suffix, ldap.SCOPE_SUBTREE, '(objectClass=*)')
2b15d0
-- 
2b15d0
2.31.1
2b15d0