@@ -1150,48 +1150,77 @@ static const char *mag_use_basic_auth(cmd_parms *parms, void *mconfig, int on)
11501150}
11511151#endif
11521152
1153- #define MAX_ALLOWED_MECHS 10
1153+ static apr_status_t mag_oid_set_destroy (void * ptr )
1154+ {
1155+ uint32_t min ;
1156+ gss_OID_set set = (gss_OID_set )ptr ;
1157+ (void )gss_release_oid_set (& min , & set );
1158+ return APR_SUCCESS ;
1159+ }
11541160
11551161static void mag_list_of_mechs (cmd_parms * parms , gss_OID_set * oidset ,
11561162 bool add_spnego , const char * w )
11571163{
1158- gss_const_OID oid ;
1164+ gss_buffer_desc buf = { 0 };
1165+ uint32_t maj , min ;
11591166 gss_OID_set set ;
1160- size_t size ;
1167+ gss_OID oid ;
1168+ bool release_oid = false;
11611169
11621170 if (NULL == * oidset ) {
1163- set = apr_pcalloc (parms -> pool , sizeof (gss_OID_set_desc ));
1164- size = sizeof (gss_OID ) * MAX_ALLOWED_MECHS ;
1165- set -> elements = apr_palloc (parms -> pool , size );
1171+ maj = gss_create_empty_oid_set (& min , & set );
1172+ if (maj != GSS_S_COMPLETE ) {
1173+ ap_log_error (APLOG_MARK , APLOG_ERR , 0 , parms -> server ,
1174+ "gss_create_empty_oid_set() failed." );
1175+ * oidset = GSS_C_NO_OID_SET ;
1176+ return ;
1177+ }
11661178 if (add_spnego ) {
1167- set -> elements [0 ] = gss_mech_spnego ;
1168- set -> count ++ ;
1179+ oid = discard_const (& gss_mech_spnego );
1180+ maj = gss_add_oid_set_member (& min , oid , & set );
1181+ if (maj != GSS_S_COMPLETE ) {
1182+ ap_log_error (APLOG_MARK , APLOG_ERR , 0 , parms -> server ,
1183+ "gss_add_oid_set_member() failed." );
1184+ (void )gss_release_oid_set (& min , & set );
1185+ * oidset = GSS_C_NO_OID_SET ;
1186+ return ;
1187+ }
11691188 }
1189+ /* register in the pool so it can be released once the server
1190+ * winds down */
1191+ apr_pool_cleanup_register (parms -> pool , (void * )set ,
1192+ mag_oid_set_destroy ,
1193+ apr_pool_cleanup_null );
11701194 * oidset = set ;
11711195 } else {
11721196 set = * oidset ;
11731197 }
11741198
11751199 if (strcmp (w , "krb5" ) == 0 ) {
1176- oid = gss_mech_krb5 ;
1200+ oid = discard_const ( gss_mech_krb5 ) ;
11771201 } else if (strcmp (w , "iakerb" ) == 0 ) {
1178- oid = gss_mech_iakerb ;
1202+ oid = discard_const ( gss_mech_iakerb ) ;
11791203 } else if (strcmp (w , "ntlmssp" ) == 0 ) {
1180- oid = & gss_mech_ntlmssp ;
1204+ oid = discard_const ( & gss_mech_ntlmssp ) ;
11811205 } else {
1182- ap_log_error (APLOG_MARK , APLOG_ERR , 0 , parms -> server ,
1183- "Unrecognized GSSAPI Mechanism: %s" , w );
1184- return ;
1206+ buf .value = discard_const (w );
1207+ buf .length = strlen (w );
1208+ maj = gss_str_to_oid (& min , & buf , & oid );
1209+ if (maj != GSS_S_COMPLETE ) {
1210+ ap_log_error (APLOG_MARK , APLOG_ERR , 0 , parms -> server ,
1211+ "Unrecognized GSSAPI Mechanism: [%s]" , w );
1212+ return ;
1213+ }
1214+ release_oid = true;
11851215 }
1186-
1187- if (set -> count >= MAX_ALLOWED_MECHS ) {
1216+ maj = gss_add_oid_set_member ( & min , oid , & set );
1217+ if (maj != GSS_S_COMPLETE ) {
11881218 ap_log_error (APLOG_MARK , APLOG_ERR , 0 , parms -> server ,
1189- "Too many GssapiAllowedMech options (MAX: %d)" ,
1190- MAX_ALLOWED_MECHS );
1191- return ;
1219+ "gss_add_oid_set_member() failed for [%s]." , w );
1220+ }
1221+ if (release_oid ) {
1222+ (void )gss_release_oid (& min , & oid );
11921223 }
1193- set -> elements [set -> count ] = * oid ;
1194- set -> count ++ ;
11951224}
11961225
11971226static const char * mag_allow_mech (cmd_parms * parms , void * mconfig ,
0 commit comments