#ifdef ENABLE_GSS_TSIG
::arg().setSwitch("enable-gss-tsig", "Enable GSS TSIG processing") = "no";
+ ::arg().set("gss-max-contexts", "The maximum number of simultaneous GSS contexts allowed") = "1000";
#endif
::arg().setSwitch("views", "Enable views (variants) of zones, for backends which support them") = "no";
#endif
#ifdef ENABLE_GSS_TSIG
g_doGssTSIG = ::arg().mustDo("enable-gss-tsig");
+ if (g_doGssTSIG) {
+ GssContext::s_maxGssContexts = ::arg().asNum("gss-max-contexts");
+ }
#endif
g_views = ::arg().mustDo("views");
g_memberCatalogGroup = ::arg()["member-catalog-group"];
#define TSIG_GSS_EXPIRE_INTERVAL 60
+unsigned int GssContext::s_maxGssContexts{1000};
+
class GssCredential : boost::noncopyable
{
public:
else {
// make context
auto lock = s_gss_sec_context.lock();
+ if (lock->size() == s_maxGssContexts) {
+ d_error = GSS_CONTEXT_LIMIT_REACHED;
+ d_gss_errors.push_back("Limit of concurrent GSS contexts reached");
+ return false;
+ }
d_secctx = std::make_shared<LockGuarded<GssSecContext>>(cred);
{
auto ctx = d_secctx->lock();
GSS_CONTEXT_NOT_INITIALIZED,
GSS_CONTEXT_INVALID,
GSS_CONTEXT_EXPIRED,
- GSS_CONTEXT_ALREADY_INITIALIZED
+ GSS_CONTEXT_ALREADY_INITIALIZED,
+ GSS_CONTEXT_LIMIT_REACHED,
};
//! GSS context types
GssContextError getError(); //<! Get error
const std::vector<std::string> getErrorStrings() { return d_gss_errors; } //<! Get native error texts
+
+ static unsigned int s_maxGssContexts; //<! Maximum number of simultaneous Gss contexts allowed
+
private:
void release(); //<! Release context
void initialize(); //<! Initialize context