Package: release.debian.org Severity: normal Tags: jessie User: release.debian....@packages.debian.org Usertags: pu
Dear OSRM, Please consider this openldap update for jessie. I apologize for the late request and will understand if it doesn't make it. * Fix upgrade failure when olcSuffix contains a backslash. (Closes: #864719) I would like to apply this fix in jessie to ensure that if openldap gets a security update during jessie LTS, affected systems will be able to install it. As well there may be some users who choose to upgrade from wheezy after its LTS ends. I have tested both upgrade scenarios (jessie->jessie and wheezy->jessie). For avoidance of doubt: this includes the changes also proposed for stretch in #901192 (the affected code is always executed in wheezy->jessie upgrades). * Import upstream patches to fix memory corruption caused by calling sasl_client_init() multiple times and possibly concurrently. (ITS#8648) (Closes: #860947) This issue affected several slapd users and came with a variety of symptoms. A typical example of an affected setup would be a multi-master setup where replication is authenticated using Kerberos (SASL/GSSAPI). These patches have been applied in stretch (in +deb9u1) and in Ubuntu xenial, with no regressions reported. thanks, Ryan -- System Information: Debian Release: 9.4 APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'proposed-updates'), (500, 'stable') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 4.9.0-6-amd64 (SMP w/2 CPU cores) Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8), LANGUAGE=en_CA.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff -u openldap-2.4.40+dfsg/debian/changelog openldap-2.4.40+dfsg/debian/changelog --- openldap-2.4.40+dfsg/debian/changelog +++ openldap-2.4.40+dfsg/debian/changelog @@ -1,3 +1,12 @@ +openldap (2.4.40+dfsg-1+deb8u4) jessie; urgency=medium + + * Fix upgrade failure when olcSuffix contains a backslash. (Closes: #864719) + * Import upstream patches to fix memory corruption caused by calling + sasl_client_init() multiple times and possibly concurrently. + (ITS#8648) (Closes: #860947) + + -- Ryan Tandy <r...@nardis.ca> Tue, 05 Jun 2018 20:16:25 -0700 + openldap (2.4.40+dfsg-1+deb8u3) jessie-security; urgency=high * debian/patches/ITS-8655-paged-results-double-free.patch: Fix a double free diff -u openldap-2.4.40+dfsg/debian/patches/series openldap-2.4.40+dfsg/debian/patches/series --- openldap-2.4.40+dfsg/debian/patches/series +++ openldap-2.4.40+dfsg/debian/patches/series @@ -29,0 +30,2 @@ +ITS-8648-check-result-of-ldap_int_initialize-in-ldap.patch +ITS-8648-init-SASL-library-in-global-init.patch diff -u openldap-2.4.40+dfsg/debian/slapd.scripts-common openldap-2.4.40+dfsg/debian/slapd.scripts-common --- openldap-2.4.40+dfsg/debian/slapd.scripts-common +++ openldap-2.4.40+dfsg/debian/slapd.scripts-common @@ -100,7 +100,7 @@ } # }}} update_databases_permissions() { # {{{ - get_suffix | while read suffix; do + get_suffix | while read -r suffix; do dbdir=`get_directory "$suffix"` update_permissions "$dbdir" done @@ -163,11 +163,11 @@ dir=`database_dumping_destdir` echo >&2 " Dumping to $dir: " - (get_suffix | while read suffix; do + (get_suffix | while read -r suffix; do dbdir=`get_directory "$suffix"` if [ -n "$dbdir" ]; then file="$dir/$suffix.ldif" - echo -n " - directory $suffix... " >&2 + printf ' - directory %s... ' "$suffix" >&2 # Need to support slapd.d migration from preinst if [ -f "${SLAPD_CONF}" ]; then slapcat_opts="-g -f ${SLAPD_CONF}" @@ -194,7 +194,7 @@ dir=`database_dumping_destdir` echo >&2 " Loading from $dir: " - get_suffix | while read suffix; do + get_suffix | while read -r suffix; do dbdir=`get_directory "$suffix"` if [ -z "$dbdir" ]; then continue @@ -206,11 +206,11 @@ fi file="$dir/$suffix.ldif" - echo -n " - directory $suffix... " >&2 + printf ' - directory %s... ' "$suffix" >&2 # If there is an old DB_CONFIG file, restore it before # running slapadd - backupdir=`compute_backup_path -n "$dbdir" "$suffix"` + backupdir="$(compute_backup_path -n "$dbdir" "$suffix")" if [ -e "$backupdir"/DB_CONFIG ]; then cp -a "$backupdir"/DB_CONFIG "$dbdir"/ fi @@ -249,7 +249,7 @@ # }}} move_incompatible_databases_away() { # {{{ echo >&2 " Moving old database directories to /var/backups:" - (get_suffix | while read suffix; do + (get_suffix | while read -r suffix; do dbdir=`get_directory "$suffix"` move_old_database_away "$dbdir" "$suffix" <&5 done) 5<&0 </dev/null @@ -270,7 +270,7 @@ get_suffix() { if [ -f "${SLAPD_CONF}" ]; then for f in `get_all_slapd_conf_files`; do - sed -n -e's/^suffix[[:space:]]\+"*\([^"]\+\)"*/\1/p' $f + sed -n -e '/^suffix[[:space:]]/ { s/^suffix[[:space:]]\+"*\([^"]\+\)"*/\1/; s/\\\\/\\/g; p }' $f done else grep -h ^olcSuffix ${SLAPD_CONF}/cn\=config/olcDatabase*.ldif | cut -d: -f 2 @@ -279,14 +279,16 @@ # }}} get_directory() { # {{{ # Returns the db directory for a given suffix - if [ -d "${SLAPD_CONF}" ] && get_suffix | grep -q "$1" ; then - sed -n 's/^olcDbDirectory: *//p' `grep -l "^olcSuffix: $1" ${SLAPD_CONF}/cn\=config/olcDatabase*.ldif` + if [ -d "${SLAPD_CONF}" ] && get_suffix | grep -Fq "$1" ; then + sed -n 's/^olcDbDirectory: *//p' `grep -Flx "olcSuffix: $1" ${SLAPD_CONF}/cn\=config/olcDatabase*.ldif` elif [ -f "${SLAPD_CONF}" ]; then # Extract the directory for the given suffix ($1) + # Quote backslashes once for slapd.conf parser, again for awk + quoted="$(printf '%s' "$1" | sed 's/\\/\\\\\\\\/g')" for f in `get_all_slapd_conf_files`; do awk ' BEGIN { DB=0; SUF=""; DIR="" } ; /^database/ { DB=1; SUF=""; DIR="" } ; - DB==1 && /^suffix[ \t]+"?'"$1"'"?$/ { SUF=$2 ; } ; + DB==1 && /^suffix[ \t]+"?'"$quoted"'"?$/ { SUF=$2 ; } ; DB==1 && /^directory/ { DIR=$2 ;} ; DB==1 && SUF!="" && DIR!="" { sub(/^"/,"",DIR) ; sub(/"$/,"",DIR) ; print DIR; SUF=""; DIR="" }' "${f}" | \ sed -e's/\([^\\]\|^\)"/\1/g; s/\\"/"/g; s/\\\\/\\/g' @@ -352,7 +354,7 @@ exit 1 fi - echo "$target" + printf '%s' "$target" } # }}} @@ -380,8 +382,8 @@ # include mount points as well anyway, but it's much less likely. db_get slapd/move_old_database if [ "$RET" = true ]; then - backupdir=`compute_backup_path "$databasedir" "$suffix"` - echo -n " - directory $suffix... " >&2 + backupdir="$(compute_backup_path "$databasedir" "$suffix")" + printf ' - directory %s... ' "$suffix" >&2 mkdir -p "$backupdir" find -H "$databasedir" -mindepth 1 -maxdepth 1 -type f \ -exec mv {} "$backupdir" \; only in patch2: unchanged: --- openldap-2.4.40+dfsg.orig/debian/patches/ITS-8648-check-result-of-ldap_int_initialize-in-ldap.patch +++ openldap-2.4.40+dfsg/debian/patches/ITS-8648-check-result-of-ldap_int_initialize-in-ldap.patch @@ -0,0 +1,30 @@ +From e437b12277c1cc8ec72e0f78f660137c60ffaad7 Mon Sep 17 00:00:00 2001 +From: Ryan Tandy <r...@nardis.ca> +Date: Sun, 7 May 2017 20:16:00 +0000 +Subject: [PATCH] ITS#8648 check result of ldap_int_initialize in + ldap_{get,set}_option + +--- + libraries/libldap/options.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/libraries/libldap/options.c ++++ b/libraries/libldap/options.c +@@ -106,6 +106,8 @@ + + if( lo->ldo_valid != LDAP_INITIALIZED ) { + ldap_int_initialize(lo, NULL); ++ if ( lo->ldo_valid != LDAP_INITIALIZED ) ++ return LDAP_LOCAL_ERROR; + } + + if(ld != NULL) { +@@ -446,6 +448,8 @@ + + if( lo->ldo_valid != LDAP_INITIALIZED ) { + ldap_int_initialize(lo, dbglvl); ++ if ( lo->ldo_valid != LDAP_INITIALIZED ) ++ return LDAP_LOCAL_ERROR; + } + + if(ld != NULL) { only in patch2: unchanged: --- openldap-2.4.40+dfsg.orig/debian/patches/ITS-8648-init-SASL-library-in-global-init.patch +++ openldap-2.4.40+dfsg/debian/patches/ITS-8648-init-SASL-library-in-global-init.patch @@ -0,0 +1,74 @@ +From 431c4af526b18abb4a18c2c4c8655690b753cbe5 Mon Sep 17 00:00:00 2001 +From: Ryan Tandy <r...@nardis.ca> +Date: Fri, 5 May 2017 03:08:07 +0000 +Subject: [PATCH] ITS#8648 init SASL library in global init + +--- + libraries/libldap/cyrus.c | 17 +++-------------- + libraries/libldap/init.c | 6 ++++++ + 2 files changed, 9 insertions(+), 14 deletions(-) + +--- a/libraries/libldap/cyrus.c ++++ b/libraries/libldap/cyrus.c +@@ -69,14 +69,11 @@ + { SASL_CB_LIST_END, NULL, NULL } + }; + ++/* ++ * ldap_int_initialize is responsible for calling this only once. ++ */ + int ldap_int_sasl_init( void ) + { +- /* XXX not threadsafe */ +- static int sasl_initialized = 0; +- +- if ( sasl_initialized ) { +- return 0; +- } + + /* SASL 2 takes care of its own memory completely internally */ + #if SASL_VERSION_MAJOR < 2 && !defined(CSRIMALLOC) +@@ -96,7 +93,6 @@ + #endif + + if ( sasl_client_init( NULL ) == SASL_OK ) { +- sasl_initialized = 1; + return 0; + } + +@@ -307,11 +303,6 @@ + return ld->ld_errno; + } + +- if ( ldap_int_sasl_init() ) { +- ld->ld_errno = LDAP_LOCAL_ERROR; +- return ld->ld_errno; +- } +- + #if SASL_VERSION_MAJOR >= 2 + rc = sasl_client_new( "ldap", host, NULL, NULL, + client_callbacks, 0, &ctx ); +@@ -891,8 +882,6 @@ + ldap_int_sasl_get_option( LDAP *ld, int option, void *arg ) + { + if ( option == LDAP_OPT_X_SASL_MECHLIST ) { +- if ( ldap_int_sasl_init() ) +- return -1; + *(char ***)arg = (char **)sasl_global_listmech(); + return 0; + } +--- a/libraries/libldap/init.c ++++ b/libraries/libldap/init.c +@@ -658,6 +658,12 @@ + if ( ldap_int_tblsize == 0 ) ldap_int_ip_init(); + #endif + ++#ifdef HAVE_CYRUS_SASL ++ if ( ldap_int_sasl_init() != 0 ) { ++ return; ++ } ++#endif ++ + ldap_int_initialize_global_options(gopts, dbglvl); + + if( getenv("LDAPNOINIT") != NULL ) {