Merge branch 'master' into tlv-mic
authorLuke Howard <lukeh@padl.com>
Sat, 26 Mar 2011 05:56:04 +0000 (16:56 +1100)
committerLuke Howard <lukeh@padl.com>
Sat, 26 Mar 2011 05:56:04 +0000 (16:56 +1100)
1  2 
mech_eap/util_attr.cpp

diff --combined mech_eap/util_attr.cpp
@@@ -282,12 -282,14 +282,14 @@@ gss_eap_attr_ctx::initFromGssContext(co
  bool
  gss_eap_attr_ctx::initFromBuffer(const gss_buffer_t buffer)
  {
-     bool ret;
+     bool ret = false;
      size_t remain = buffer->length;
      unsigned char *p = (unsigned char *)buffer->value;
      bool didInit[ATTR_TYPE_MAX + 1];
+     unsigned int type;
  
-     memset(didInit, 0, sizeof(didInit));
+     for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++)
+         didInit[type] = false;
  
      /* flags */
      CHECK_REMAIN(4);
          didInit[type] = true;
      }
  
-     for (size_t i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
+     /*
+      * The call the initFromGssContext methods for attribute
+      * providers that can initialize themselves from other
+      * providers.
+      */
+     for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++) {
          gss_eap_attr_provider *provider;
  
-         if (didInit[i])
+         if (didInit[type])
              continue;
  
-         provider = m_providers[i];
+         provider = m_providers[type];
  
          ret = provider->initFromGssContext(this,
                                             GSS_C_NO_CREDENTIAL,
                                             GSS_C_NO_CONTEXT);
          if (ret == false) {
-             releaseProvider(i);
+             releaseProvider(type);
              break;
          }
      }
@@@ -599,10 -606,14 +606,14 @@@ gss_eap_attr_ctx::exportToBuffer(gss_bu
      gss_buffer_desc providerTokens[ATTR_TYPE_MAX + 1];
      size_t length = 4; /* m_flags */
      unsigned char *p;
+     unsigned int i;
  
-     memset(providerTokens, 0, sizeof(providerTokens));
+     for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
+         providerTokens[i].length = 0;
+         providerTokens[i].value = NULL;
+     }
  
-     for (size_t i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
+     for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
          gss_eap_attr_provider *provider = m_providers[i];
  
          if (provider == NULL)
      store_uint32_be(m_flags, p);
      p += 4;
  
-     for (size_t i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
+     for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
          if (providerTokens[i].value == NULL)
              continue;
  
@@@ -849,15 -860,13 +860,15 @@@ gssEapInquireName(OM_uint32 *minor
          return GSS_S_UNAVAILABLE;
      }
  
 -    try {
 -        if (!name->attrCtx->getAttributeTypes(attrs)) {
 -            *minor = GSSEAP_NO_ATTR_CONTEXT;
 -            return GSS_S_UNAVAILABLE;
 +    if (attrs != NULL) {
 +        try {
 +            if (!name->attrCtx->getAttributeTypes(attrs)) {
 +                *minor = GSSEAP_NO_ATTR_CONTEXT;
 +                return GSS_S_UNAVAILABLE;
 +            }
 +        } catch (std::exception &e) {
 +            return name->attrCtx->mapException(minor, e);
          }
 -    } catch (std::exception &e) {
 -        return name->attrCtx->mapException(minor, e);
      }
  
      return GSS_S_COMPLETE;