diff -up cyrus-sasl-2.1.26/plugins/gssapi.c.gssapi_non_encrypt cyrus-sasl-2.1.26/plugins/gssapi.c --- cyrus-sasl-2.1.26/plugins/gssapi.c.gssapi_non_encrypt 2015-05-19 14:57:57.091212254 +0200 +++ cyrus-sasl-2.1.26/plugins/gssapi.c 2015-05-19 15:01:41.681011361 +0200 @@ -1159,19 +1159,18 @@ gssapi_server_mech_ssfreq(context_t *tex } layerchoice = (int)(((char *)(output_token->value))[0]); - if (layerchoice == LAYER_NONE && - (text->qop & LAYER_NONE)) { /* no encryption */ + if (!(layerchoice & (LAYER_INTEGRITY | LAYER_CONFIDENTIALITY)) && + (text->qop & LAYER_NONE)) { /* no encryption */ oparams->encode = NULL; oparams->decode = NULL; oparams->mech_ssf = 0; - } else if (layerchoice == LAYER_INTEGRITY && + } else if ((layerchoice & LAYER_INTEGRITY) && (text->qop & LAYER_INTEGRITY)) { /* integrity */ oparams->encode = &gssapi_integrity_encode; oparams->decode = &gssapi_decode; oparams->mech_ssf = 1; - } else if ((layerchoice == LAYER_CONFIDENTIALITY || - /* For compatibility with broken clients setting both bits */ - layerchoice == (LAYER_CONFIDENTIALITY|LAYER_INTEGRITY)) && + } else if (/* For compatibility with broken clients setting both bits */ + (layerchoice & (LAYER_CONFIDENTIALITY | LAYER_INTEGRITY)) && (text->qop & LAYER_CONFIDENTIALITY)) { /* privacy */ oparams->encode = &gssapi_privacy_encode; oparams->decode = &gssapi_decode;