@@ -471,17 +471,23 @@ void INI_format(const char* owner, const char* charset)
471471 charset->name;
472472 ++charset)
473473 {
474- add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_charset, charset->name, length, buffer);
474+ add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_charset,
475+ charset->name, length, buffer);
475476 }
476477
477478 reqModObjSC.reset();
478479 for (const IntlManager::CollationDefinition* collation = IntlManager::defaultCollations;
479480 collation->name;
480481 ++collation)
481482 {
482- add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_collation, collation->name, length, buffer);
483+ add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_collation,
484+ collation->name, length, buffer);
483485 }
484486
487+ reqModObjSC.reset();
488+ add_security_to_sys_obj(tdbb, reqAddSC, reqModObjSC, reqInsUserPriv, ownerName, obj_sql_role,
489+ ADMIN_ROLE, length, buffer);
490+
485491 // Must be last!
486492 acl = aclPublicStart;
487493 memcpy(acl, PKG_PUBLIC_EXECUTE_ACL, sizeof(PKG_PUBLIC_EXECUTE_ACL));
@@ -1205,6 +1211,18 @@ static void add_security_to_sys_obj(thread_db* tdbb,
12051211 }
12061212 END_FOR
12071213 }
1214+ else if (obj_type == obj_sql_role)
1215+ {
1216+ FOR(REQUEST_HANDLE reqModObjSC) R IN RDB$ROLES
1217+ WITH R.RDB$ROLE_NAME EQ obj_name.c_str()
1218+ {
1219+ MODIFY R USING
1220+ R.RDB$SECURITY_CLASS.NULL = FALSE;
1221+ PAD(security_class.c_str(), R.RDB$SECURITY_CLASS);
1222+ END_MODIFY
1223+ }
1224+ END_FOR
1225+ }
12081226 else if (obj_type == obj_package_header)
12091227 {
12101228 FOR(REQUEST_HANDLE reqModObjSC) PKG IN RDB$PACKAGES
0 commit comments