size_t *pRemain,
gss_ctx_id_t ctx)
{
+ OM_uint32 major;
unsigned char *p = *pBuf;
size_t remain = *pRemain;
gss_buffer_desc buf;
*minor = ERANGE;
return GSS_S_DEFECTIVE_TOKEN;
}
-
buf.length = load_uint32_be(p);
- if (buf.length != 0) {
- *minor = EINVAL;
+ if (remain < buf.length) {
+ *minor = ERANGE;
return GSS_S_DEFECTIVE_TOKEN;
+
}
+ buf.value = &p[4];
+
+ major = duplicateBuffer(minor, &buf, &ctx->acceptorCtx.state);
+ if (GSS_ERROR(major))
+ return major;
+
+ *pBuf += 4 + buf.length;
+ *pRemain -= 4 + buf.length;
- *minor = 0;
return GSS_S_COMPLETE;
}
#include "gssapiP_eap.h"
+VALUE_PAIR *
+gss_eap_radius_attr_provider::copyAvps(const VALUE_PAIR *in)
+{
+ return NULL;
+}
+
gss_eap_radius_attr_provider::gss_eap_radius_attr_provider(void)
{
+ m_avps = NULL;
m_authenticated = false;
}
gss_eap_radius_attr_provider::~gss_eap_radius_attr_provider(void)
{
+ if (m_avps != NULL)
+ rc_avpair_free(m_avps);
}
bool
gss_eap_radius_attr_provider::mapToAny(int authenticated,
gss_buffer_t type_id) const
{
- return (gss_any_t)NULL;
+ if (authenticated && !m_authenticated)
+ return (gss_any_t)NULL;
+
+ return (gss_any_t)copyAvps(m_avps);
}
void
gss_eap_radius_attr_provider::releaseAnyNameMapping(gss_buffer_t type_id,
gss_any_t input) const
{
+ rc_avpair_free((VALUE_PAIR *)input);
}
void
static gss_eap_attr_provider *createAttrContext(void);
private:
+ static VALUE_PAIR *copyAvps(const VALUE_PAIR *in);
+
+ VALUE_PAIR *m_avps;
bool m_authenticated;
};
gss_eap_saml_assertion_provider::mapToAny(int authenticated,
gss_buffer_t type_id) const
{
+ if (authenticated && !m_authenticated)
+ return (gss_any_t)NULL;
+
return (gss_any_t)m_assertion;
}
{
gss_any_t output;
+ if (authenticated && !m_authenticated)
+ return (gss_any_t)NULL;
+
vector <Attribute *>v = duplicateAttributes(m_attributes);
output = (gss_any_t)new vector <Attribute *>(v);