$NetBSD: patch-ab,v 1.1 2005/03/16 12:55:02 rillig Exp $ --- radproto.cxx.orig Tue Aug 10 01:32:11 2004 +++ radproto.cxx Wed Mar 16 12:38:12 2005 @@ -238,16 +238,20 @@ unsigned GetRadiusInteger( } // anonymous namespace -RadiusAttr::RadiusAttr() : m_type(0), m_length(0) +RadiusAttr::RadiusAttr() { + s.m_type = 0; + s.m_length = 0; } RadiusAttr::RadiusAttr( unsigned char attrType, /// type of the attribute const void* attrValue, /// actual attribute value data PINDEX valueLength /// length for the attribute value - ) : m_type(attrType), m_length(FixedHeaderLength) + ) { + s.m_type = attrType; + s.m_length = FixedHeaderLength; if (valueLength > 0) PAssertNULL(attrValue); @@ -259,9 +263,9 @@ RadiusAttr::RadiusAttr( valueLength = MaxValueLength; if (valueLength > 0) { - m_length = m_length + (unsigned char)valueLength; + s.m_length = s.m_length + (unsigned char)valueLength; if (attrValue != NULL) - memcpy(m_value, attrValue, valueLength); + memcpy(s.m_value, attrValue, valueLength); } } @@ -270,10 +274,13 @@ RadiusAttr::RadiusAttr( PINDEX valueLength, /// data length (bytes) int vendorId, /// 32 bit vendor identifier unsigned char vendorType /// vendor-specific attribute type - ) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength), - m_vendorType(vendorType), m_vendorLength(2) + ) { - SetRadiusInteger(m_vendorId, vendorId); + s.m_type = VendorSpecific; + s.m_length = VsaRfc2865FixedHeaderLength; + s.s.m_vendorType = vendorType; + s.s.m_vendorLength = 2; + SetRadiusInteger(s.s.m_vendorId, vendorId); if (valueLength > 0) PAssertNULL(attrValue); @@ -286,18 +293,20 @@ RadiusAttr::RadiusAttr( valueLength = VsaMaxRfc2865ValueLength; if (valueLength > 0) { - m_length = m_length + (unsigned char)valueLength; - m_vendorLength = m_vendorLength + (unsigned char)valueLength; + s.m_length = s.m_length + (unsigned char)valueLength; + s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)valueLength; if (attrValue != NULL) - memcpy(m_vendorValue, attrValue, valueLength); + memcpy(s.s.m_vendorValue, attrValue, valueLength); } } RadiusAttr::RadiusAttr( unsigned char attrType, /// Attribute Type (see #enum AttrTypes#) const PString& stringValue /// string to be stored in the attribute Value data - ) : m_type(attrType), m_length(FixedHeaderLength) + ) { + s.m_type = attrType; + s.m_length = FixedHeaderLength; if (attrType == VendorSpecific) PAssertAlways(PInvalidParameter); @@ -307,46 +316,53 @@ RadiusAttr::RadiusAttr( attrLength = MaxValueLength; if (attrLength > 0) { - m_length = m_length + (unsigned char)attrLength; - memcpy(m_value, (const char*)stringValue, attrLength); + s.m_length = s.m_length + (unsigned char)attrLength; + memcpy(s.m_value, (const char*)stringValue, attrLength); } } RadiusAttr::RadiusAttr( unsigned char attrType, /// Attribute Type (see #enum AttrTypes#) int intValue /// 32 bit integer to be stored in the attribute Value - ) : m_type(attrType), m_length(FixedHeaderLength + 4) + ) { + s.m_type = attrType; + s.m_length = FixedHeaderLength + 4; if (attrType == VendorSpecific) PAssertAlways(PInvalidParameter); - SetRadiusInteger(m_value, intValue); + SetRadiusInteger(s.m_value, intValue); } RadiusAttr::RadiusAttr( unsigned char attrType, /// Attribute Type (see #enum AttrTypes#) const PIPSocket::Address& addressValue /// IPv4 address to be stored in the attribute Value - ) : m_type(attrType), m_length(FixedHeaderLength + 4) + ) { + s.m_type = attrType; + s.m_length = FixedHeaderLength + 4; if (attrType == VendorSpecific) PAssertAlways(PInvalidParameter); const DWORD addr = (DWORD)addressValue; - m_value[0] = ((const BYTE*)&addr)[0]; - m_value[1] = ((const BYTE*)&addr)[1]; - m_value[2] = ((const BYTE*)&addr)[2]; - m_value[3] = ((const BYTE*)&addr)[3]; + s.m_value[0] = ((const BYTE*)&addr)[0]; + s.m_value[1] = ((const BYTE*)&addr)[1]; + s.m_value[2] = ((const BYTE*)&addr)[2]; + s.m_value[3] = ((const BYTE*)&addr)[3]; } RadiusAttr::RadiusAttr( const PString& stringValue, /// string to be stored in the attribute Value int vendorId, /// 32 bit vendor identifier unsigned char vendorType /// vendor-specific attribute type - ) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength), - m_vendorType(vendorType), m_vendorLength(2) + ) { - SetRadiusInteger(m_vendorId, vendorId); + s.m_type = VendorSpecific; + s.m_length = VsaRfc2865FixedHeaderLength; + s.s.m_vendorType = vendorType; + s.s.m_vendorLength = 2; + SetRadiusInteger(s.s.m_vendorId, vendorId); PINDEX vsaLength = stringValue.GetLength(); @@ -357,9 +373,9 @@ RadiusAttr::RadiusAttr( vsaLength = VsaMaxRfc2865ValueLength; if (vsaLength > 0) { - m_length = m_length + (unsigned char)vsaLength; - m_vendorLength = m_vendorLength + (unsigned char)vsaLength; - memcpy(m_vendorValue, (const char*)stringValue, vsaLength); + s.m_length = s.m_length + (unsigned char)vsaLength; + s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)vsaLength; + memcpy(s.s.m_vendorValue, (const char*)stringValue, vsaLength); } } @@ -367,71 +383,82 @@ RadiusAttr::RadiusAttr( int intValue, /// 32 bit integer to be stored in the attribute Value int vendorId, /// 32 bit vendor identifier unsigned char vendorType /// vendor-specific attribute type - ) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength + 4), - m_vendorType(vendorType), m_vendorLength(2 + 4) + ) { - SetRadiusInteger(m_vendorId, vendorId); - SetRadiusInteger(m_vendorValue, intValue); + s.m_type=VendorSpecific; + s.m_length=VsaRfc2865FixedHeaderLength + 4; + s.s.m_vendorType=vendorType; + s.s.m_vendorLength=2 + 4; + SetRadiusInteger(s.s.m_vendorId, vendorId); + SetRadiusInteger(s.s.m_vendorValue, intValue); } RadiusAttr::RadiusAttr( const PIPSocket::Address& addressValue, /// IPv4 address to be stored in the attribute Value int vendorId, /// 32 bit vendor identifier unsigned char vendorType /// vendor-specific attribute type - ) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength + 4), - m_vendorType(vendorType), m_vendorLength(2 + 4) + ) { - SetRadiusInteger(m_vendorId, vendorId); + s.m_type = VendorSpecific; + s.m_length = VsaRfc2865FixedHeaderLength + 4; + s.s.m_vendorType = vendorType; + s.s.m_vendorLength = 2 + 4; + SetRadiusInteger(s.s.m_vendorId, vendorId); const DWORD addr = (DWORD)addressValue; - m_vendorValue[0] = ((BYTE*)&addr)[0]; - m_vendorValue[1] = ((BYTE*)&addr)[1]; - m_vendorValue[2] = ((BYTE*)&addr)[2]; - m_vendorValue[3] = ((BYTE*)&addr)[3]; + s.s.m_vendorValue[0] = ((BYTE*)&addr)[0]; + s.s.m_vendorValue[1] = ((BYTE*)&addr)[1]; + s.s.m_vendorValue[2] = ((BYTE*)&addr)[2]; + s.s.m_vendorValue[3] = ((BYTE*)&addr)[3]; } RadiusAttr::RadiusAttr( unsigned char type, /// Cisco-specific attribute type bool vsaHack, /// true to not prepend attribute name to its value const PString& stringValue /// string to be stored in the attribute Value - ) : m_type(VendorSpecific), m_length(VsaRfc2865FixedHeaderLength), - m_vendorType(type), m_vendorLength(2) + ) { - SetRadiusInteger(m_vendorId, CiscoVendorId); + s.m_type = VendorSpecific; + s.m_length = VsaRfc2865FixedHeaderLength; + s.s.m_vendorType = type; + s.s.m_vendorLength = 2; + SetRadiusInteger(s.s.m_vendorId, CiscoVendorId); if (!vsaHack) { int i = 0; while (CiscoAttrNames[i].m_name != NULL) if (CiscoAttrNames[i].m_type == type) { - memcpy(m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen); - m_length = m_length + (unsigned char)CiscoAttrNames[i].m_nameLen; - m_vendorLength = m_vendorLength + (unsigned char)CiscoAttrNames[i].m_nameLen; - m_data[m_length++] = '='; - m_vendorLength++; + memcpy(s.s.m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen); + s.m_length = s.m_length + (unsigned char)CiscoAttrNames[i].m_nameLen; + s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)CiscoAttrNames[i].m_nameLen; + m_data[s.m_length++] = '='; + s.s.m_vendorLength++; break; } else i++; } const PINDEX len = stringValue.GetLength(); - if (((PINDEX)m_length + len) > MaxLength) + if (((PINDEX)s.m_length + len) > MaxLength) return; - memcpy(m_data + (PINDEX)m_length, (const char*)stringValue, len); - m_length = m_length + (unsigned char)len; - m_vendorLength = m_vendorLength + (unsigned char)len; + memcpy(m_data + (PINDEX)s.m_length, (const char*)stringValue, len); + s.m_length = s.m_length + (unsigned char)len; + s.s.m_vendorLength = s.s.m_vendorLength + (unsigned char)len; } RadiusAttr::RadiusAttr( const void* rawData, /// buffer with the attribute raw data PINDEX rawLength /// length (bytes) of the buffer - ) : m_type(0), m_length(0) + ) { + s.m_type = 0; + s.m_length = 0; Read(rawData, rawLength); } int RadiusAttr::GetVsaVendorId() const { - return GetRadiusInteger(m_vendorId); + return GetRadiusInteger(s.s.m_vendorId); } bool RadiusAttr::Write( @@ -446,7 +473,7 @@ bool RadiusAttr::Write( if (offset == P_MAX_INDEX) offset = buffer.GetSize(); - const PINDEX len = m_length; + const PINDEX len = s.m_length; memcpy(buffer.GetPointer(offset + len) + offset, m_data, len); written = len; @@ -455,7 +482,7 @@ bool RadiusAttr::Write( bool RadiusAttr::Read(const void* rawData, PINDEX rawLength) { - m_type = m_length = 0; + s.m_type = s.m_length = 0; #ifdef _DEBUG PAssertNULL(rawData); @@ -483,9 +510,9 @@ void RadiusAttr::PrintOn( if (!IsValid()) { strm << "(Invalid) {\n"; - if (m_length > 0) { + if (s.m_length > 0) { const _Ios_Fmtflags flags = strm.flags(); - const PBYTEArray value((const BYTE*)m_data, m_length, FALSE); + const PBYTEArray value((const BYTE*)m_data, s.m_length, FALSE); strm << hex << setfill('0') << resetiosflags(ios::floatfield) << setprecision(indent) << setw(16); @@ -508,12 +535,12 @@ void RadiusAttr::PrintOn( strm << "{\n"; #if PTRACING - strm << setw(indent+7) << "type = " << (unsigned)m_type - << " (" << PMAP_ATTR_TYPE_TO_NAME(m_type) << ")\n"; + strm << setw(indent+7) << "type = " << (unsigned)s.m_type + << " (" << PMAP_ATTR_TYPE_TO_NAME(s.m_type) << ")\n"; #else - strm << setw(indent+7) << "type = " << (unsigned)m_type << '\n'; + strm << setw(indent+7) << "type = " << (unsigned)s.m_type << '\n'; #endif - const PINDEX totalLen = m_length; + const PINDEX totalLen = s.m_length; strm << setw(indent+9) << "length = " << totalLen << " octets\n"; @@ -521,7 +548,7 @@ void RadiusAttr::PrintOn( const _Ios_Fmtflags flags = strm.flags(); const PINDEX valueLen = (totalLen <= FixedHeaderLength) ? 0 : (totalLen - FixedHeaderLength); - const PBYTEArray value((const BYTE*)m_value, valueLen, FALSE); + const PBYTEArray value((const BYTE*)s.m_value, valueLen, FALSE); strm << setw(indent+8) << "value = " << value.GetSize() << " octets {\n"; strm << hex << setfill('0') << resetiosflags(ios::floatfield) @@ -552,9 +579,9 @@ void RadiusAttr::PrintOn( valueLen -= 2; headerLen += 2; strm << setw(indent+13) << "vendorType = " - << (unsigned)m_vendorType << '\n'; + << (unsigned)s.s.m_vendorType << '\n'; strm << setw(indent+15) << "vendorLength = " - << (unsigned)m_vendorLength << '\n'; + << (unsigned)s.s.m_vendorLength << '\n'; } const PBYTEArray value((const BYTE*)(m_data + headerLen), valueLen, FALSE); @@ -582,13 +609,13 @@ void RadiusAttr::PrintOn( PINDEX RadiusAttr::GetVsaValueLength() const { - PINDEX len = m_length; + PINDEX len = s.m_length; len = (len <= VsaRfc2865FixedHeaderLength) ? 0 : (len - VsaRfc2865FixedHeaderLength); PINDEX len2 = 0; if (len > 0) { - len2 = m_vendorLength; + len2 = s.s.m_vendorLength; len2 = (len2 <= 2) ? 0 : (len2 - 2); } if (len2 < len) @@ -626,7 +653,7 @@ bool RadiusAttr::GetVsaValue(PBYTEArray& offset = buffer.GetSize(); if (len > 0) - memcpy(buffer.GetPointer(len + offset) + offset, m_vendorValue, len); + memcpy(buffer.GetPointer(len + offset) + offset, s.s.m_vendorValue, len); return true; } @@ -636,8 +663,8 @@ PString RadiusAttr::AsString() const if (!IsValid()) return PString(); - const PINDEX len = m_length; - const PINDEX headerLen = (m_type == VendorSpecific) + const PINDEX len = s.m_length; + const PINDEX headerLen = (s.m_type == VendorSpecific) ? VsaFixedHeaderLength : FixedHeaderLength; if (len <= headerLen) @@ -648,52 +675,52 @@ PString RadiusAttr::AsString() const int RadiusAttr::AsInteger() const { - if (m_length < (FixedHeaderLength+4) || m_type == VendorSpecific) + if (s.m_length < (FixedHeaderLength+4) || s.m_type == VendorSpecific) return 0; - return GetRadiusInteger(m_value); + return GetRadiusInteger(s.m_value); } PIPSocket::Address RadiusAttr::AsAddress() const { - if (m_length < (FixedHeaderLength+4) || m_type == VendorSpecific) + if (s.m_length < (FixedHeaderLength+4) || s.m_type == VendorSpecific) return 0; DWORD addr = 0; - - ((BYTE*)&addr)[0] = m_value[0]; - ((BYTE*)&addr)[1] = m_value[1]; - ((BYTE*)&addr)[2] = m_value[2]; - ((BYTE*)&addr)[3] = m_value[3]; + + ((BYTE*)&addr)[0] = s.m_value[0]; + ((BYTE*)&addr)[1] = s.m_value[1]; + ((BYTE*)&addr)[2] = s.m_value[2]; + ((BYTE*)&addr)[3] = s.m_value[3]; return addr; } PString RadiusAttr::AsVsaString() const { - if (!IsValid() || m_type != VendorSpecific) + if (!IsValid() || s.m_type != VendorSpecific) return PString(); - const PINDEX len = m_length; + const PINDEX len = s.m_length; if (len <= VsaRfc2865FixedHeaderLength) return PString(); else - return PString((const char*)m_vendorValue, len - VsaRfc2865FixedHeaderLength); + return PString((const char*)s.s.m_vendorValue, len - VsaRfc2865FixedHeaderLength); } PString RadiusAttr::AsCiscoString() const { - if (!IsValid() || m_type != VendorSpecific - || GetRadiusInteger(m_vendorId) != CiscoVendorId) + if (!IsValid() || s.m_type != VendorSpecific + || GetRadiusInteger(s.s.m_vendorId) != CiscoVendorId) return PString(); - const PINDEX len = m_length; + const PINDEX len = s.m_length; PINDEX offset = VsaRfc2865FixedHeaderLength; int i = 0; while (CiscoAttrNames[i].m_name != NULL) - if (CiscoAttrNames[i].m_type == m_vendorType) { + if (CiscoAttrNames[i].m_type == s.s.m_vendorType) { if (CiscoAttrNames[i].m_nameLen < (size_t)(len - offset)) if (memcmp(m_data + offset, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen) == 0 @@ -711,30 +738,32 @@ PString RadiusAttr::AsCiscoString() cons int RadiusAttr::AsVsaInteger() const { - if (m_length < (VsaRfc2865FixedHeaderLength+4) || m_type != VendorSpecific) + if (s.m_length < (VsaRfc2865FixedHeaderLength+4) || s.m_type != VendorSpecific) return 0; - return GetRadiusInteger(m_vendorValue); + return GetRadiusInteger(s.s.m_vendorValue); } PIPSocket::Address RadiusAttr::AsVsaAddress() const { - if (m_length < (VsaRfc2865FixedHeaderLength+4) || m_type != VendorSpecific) + if (s.m_length < (VsaRfc2865FixedHeaderLength+4) || s.m_type != VendorSpecific) return 0; DWORD addr = 0; - ((BYTE*)&addr)[0] = m_vendorValue[0]; - ((BYTE*)&addr)[1] = m_vendorValue[1]; - ((BYTE*)&addr)[2] = m_vendorValue[2]; - ((BYTE*)&addr)[3] = m_vendorValue[3]; + ((BYTE*)&addr)[0] = s.s.m_vendorValue[0]; + ((BYTE*)&addr)[1] = s.s.m_vendorValue[1]; + ((BYTE*)&addr)[2] = s.s.m_vendorValue[2]; + ((BYTE*)&addr)[3] = s.s.m_vendorValue[3]; return addr; } -RadiusPDU::RadiusPDU() : m_code(Invalid), m_id(0) +RadiusPDU::RadiusPDU() { + s.m_code = 0; + s.m_id = 0; SetLength(FixedHeaderLength); } @@ -748,8 +777,10 @@ RadiusPDU::RadiusPDU( RadiusPDU::RadiusPDU( unsigned char packetCode, /// code - see #Codes enum# unsigned char packetId /// packet id (sequence number) - ) : m_code(packetCode), m_id(packetId) + ) { + s.m_code = packetCode; + s.m_id = packetId; SetLength(FixedHeaderLength); } @@ -759,7 +790,7 @@ RadiusPDU::RadiusPDU( ) { if (!Read(rawData, rawLength)) { - m_code = m_id = Invalid; + s.m_code = s.m_id = Invalid; SetLength(FixedHeaderLength); } } @@ -773,16 +804,16 @@ void RadiusPDU::PrintOn( strm << ((!IsValid()) ? "(Invalid) {\n" : "{\n"); #if PTRACING - strm << setw(indent+7) << "code = " << (unsigned)m_code - << " (" << PMAP_CODE_TO_NAME(m_code) << ")\n"; + strm << setw(indent+7) << "code = " << (unsigned)s.m_code + << " (" << PMAP_CODE_TO_NAME(s.m_code) << ")\n"; #else - strm << setw(indent+7) << "code = " << (unsigned)m_code << '\n'; + strm << setw(indent+7) << "code = " << (unsigned)s.m_code << '\n'; #endif - strm << setw(indent+5) << "id = " << (unsigned)m_id << '\n'; + strm << setw(indent+5) << "id = " << (unsigned)s.m_id << '\n'; strm << setw(indent+9) << "length = " << GetLength() << " octets\n"; const _Ios_Fmtflags flags = strm.flags(); - const PBYTEArray value((const BYTE*)m_authenticator, AuthenticatorLength, FALSE); + const PBYTEArray value((const BYTE*)s.m_authenticator, AuthenticatorLength, FALSE); strm << setw(indent+28) << "authenticator = 16 octets {\n"; strm << hex << setfill('0') << resetiosflags(ios::floatfield) @@ -816,7 +847,7 @@ void RadiusPDU::PrintOn( bool RadiusPDU::IsValid() const { - if (m_code == Invalid) + if (s.m_code == Invalid) return false; const PINDEX len = GetLength(); @@ -842,7 +873,7 @@ void RadiusPDU::GetAuthenticator(PBYTEAr if (offset == P_MAX_INDEX) offset = vector.GetSize(); memcpy(vector.GetPointer(offset + AuthenticatorLength) + offset, - m_authenticator, AuthenticatorLength + s.m_authenticator, AuthenticatorLength ); } @@ -855,7 +886,7 @@ bool RadiusPDU::SetAuthenticator(const P len -= offset; if (len > 0) - memcpy(m_authenticator, ((const BYTE*)vector)+offset, + memcpy(s.m_authenticator, ((const BYTE*)vector)+offset, (len < AuthenticatorLength) ? len : AuthenticatorLength ); @@ -870,32 +901,32 @@ bool RadiusPDU::SetAuthenticator(const v if (data == NULL) return false; - memcpy(m_authenticator, data, AuthenticatorLength); + memcpy(s.m_authenticator, data, AuthenticatorLength); return true; } void RadiusPDU::SetAuthenticator(PRandom& random) { DWORD r = (DWORD)random; - m_authenticator[0] = ((const BYTE*)&r)[0]; - m_authenticator[1] = ((const BYTE*)&r)[1]; - m_authenticator[2] = ((const BYTE*)&r)[2]; - m_authenticator[3] = ((const BYTE*)&r)[3]; + s.m_authenticator[0] = ((const BYTE*)&r)[0]; + s.m_authenticator[1] = ((const BYTE*)&r)[1]; + s.m_authenticator[2] = ((const BYTE*)&r)[2]; + s.m_authenticator[3] = ((const BYTE*)&r)[3]; r = (DWORD)random; - m_authenticator[4] = ((const BYTE*)&r)[0]; - m_authenticator[5] = ((const BYTE*)&r)[1]; - m_authenticator[6] = ((const BYTE*)&r)[2]; - m_authenticator[7] = ((const BYTE*)&r)[3]; + s.m_authenticator[4] = ((const BYTE*)&r)[0]; + s.m_authenticator[5] = ((const BYTE*)&r)[1]; + s.m_authenticator[6] = ((const BYTE*)&r)[2]; + s.m_authenticator[7] = ((const BYTE*)&r)[3]; r = (DWORD)random; - m_authenticator[8] = ((const BYTE*)&r)[0]; - m_authenticator[9] = ((const BYTE*)&r)[1]; - m_authenticator[10] = ((const BYTE*)&r)[2]; - m_authenticator[11] = ((const BYTE*)&r)[3]; + s.m_authenticator[8] = ((const BYTE*)&r)[0]; + s.m_authenticator[9] = ((const BYTE*)&r)[1]; + s.m_authenticator[10] = ((const BYTE*)&r)[2]; + s.m_authenticator[11] = ((const BYTE*)&r)[3]; r = (DWORD)random; - m_authenticator[12] = ((const BYTE*)&r)[0]; - m_authenticator[13] = ((const BYTE*)&r)[1]; - m_authenticator[14] = ((const BYTE*)&r)[2]; - m_authenticator[15] = ((const BYTE*)&r)[3]; + s.m_authenticator[12] = ((const BYTE*)&r)[0]; + s.m_authenticator[13] = ((const BYTE*)&r)[1]; + s.m_authenticator[14] = ((const BYTE*)&r)[2]; + s.m_authenticator[15] = ((const BYTE*)&r)[3]; } void RadiusPDU::SetAuthenticator( @@ -903,11 +934,11 @@ void RadiusPDU::SetAuthenticator( PMessageDigest5& md5 ) { - if (m_code == AccountingRequest) { + if (s.m_code == AccountingRequest) { const PINDEX pduLength = GetLength(); const PINDEX secretLength = secret.GetLength(); - memset(m_authenticator, 0, AuthenticatorLength); + memset(s.m_authenticator, 0, AuthenticatorLength); md5.Start(); md5.Process(m_data, pduLength); @@ -916,7 +947,7 @@ void RadiusPDU::SetAuthenticator( PMessageDigest::Result digest; md5.CompleteDigest(digest); - memcpy(m_authenticator, digest.GetPointer(), AuthenticatorLength); + memcpy(s.m_authenticator, digest.GetPointer(), AuthenticatorLength); } else { PRandom random; SetAuthenticator(random); @@ -950,9 +981,9 @@ bool RadiusPDU::AppendAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = attrType; - attr->m_length = attrLen; - memcpy(attr->m_value, attrValue, valueLength); + attr->s.m_type = attrType; + attr->s.m_length = attrLen; + memcpy(attr->s.m_value, attrValue, valueLength); SetLength(len + attrLen); return true; @@ -969,9 +1000,9 @@ bool RadiusPDU::AppendAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = attrType; - attr->m_length = attrLen; - memcpy(attr->m_value, (const char*)stringValue, stringValue.GetLength()); + attr->s.m_type = attrType; + attr->s.m_length = attrLen; + memcpy(attr->s.m_value, (const char*)stringValue, stringValue.GetLength()); SetLength(len + attrLen); return true; @@ -988,9 +1019,9 @@ bool RadiusPDU::AppendAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = attrType; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_value, intValue); + attr->s.m_type = attrType; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.m_value, intValue); SetLength(len + attrLen); return true; @@ -1008,12 +1039,12 @@ bool RadiusPDU::AppendAttr( const DWORD addr = (DWORD)addressValue; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = attrType; - attr->m_length = attrLen; - attr->m_value[0] = ((const BYTE*)&addr)[0]; - attr->m_value[1] = ((const BYTE*)&addr)[1]; - attr->m_value[2] = ((const BYTE*)&addr)[2]; - attr->m_value[3] = ((const BYTE*)&addr)[3]; + attr->s.m_type = attrType; + attr->s.m_length = attrLen; + attr->s.m_value[0] = ((const BYTE*)&addr)[0]; + attr->s.m_value[1] = ((const BYTE*)&addr)[1]; + attr->s.m_value[2] = ((const BYTE*)&addr)[2]; + attr->s.m_value[3] = ((const BYTE*)&addr)[3]; SetLength(len + attrLen); return true; @@ -1032,12 +1063,12 @@ bool RadiusPDU::AppendVsaAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = RadiusAttr::VendorSpecific; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_vendorId, vendorId); - attr->m_vendorType = vendorType; - attr->m_vendorLength = valueLength + 2; - memcpy(attr->m_vendorValue, attrValue, valueLength); + attr->s.m_type = RadiusAttr::VendorSpecific; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.s.m_vendorId, vendorId); + attr->s.s.m_vendorType = vendorType; + attr->s.s.m_vendorLength = valueLength + 2; + memcpy(attr->s.s.m_vendorValue, attrValue, valueLength); SetLength(len + attrLen); return true; @@ -1056,12 +1087,12 @@ bool RadiusPDU::AppendVsaAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = RadiusAttr::VendorSpecific; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_vendorId, vendorId); - attr->m_vendorType = vendorType; - attr->m_vendorLength = valueLen + 2; - memcpy(attr->m_vendorValue, (const char*)stringValue, valueLen); + attr->s.m_type = RadiusAttr::VendorSpecific; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.s.m_vendorId, vendorId); + attr->s.s.m_vendorType = vendorType; + attr->s.s.m_vendorLength = valueLen + 2; + memcpy(attr->s.s.m_vendorValue, (const char*)stringValue, valueLen); SetLength(len + attrLen); return true; @@ -1079,12 +1110,12 @@ bool RadiusPDU::AppendVsaAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = RadiusAttr::VendorSpecific; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_vendorId, vendorId); - attr->m_vendorType = vendorType; - attr->m_vendorLength = 4 + 2; - SetRadiusInteger(attr->m_vendorValue, intValue); + attr->s.m_type = RadiusAttr::VendorSpecific; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.s.m_vendorId, vendorId); + attr->s.s.m_vendorType = vendorType; + attr->s.s.m_vendorLength = 4 + 2; + SetRadiusInteger(attr->s.s.m_vendorValue, intValue); SetLength(len + attrLen); return true; @@ -1103,15 +1134,15 @@ bool RadiusPDU::AppendVsaAttr( const DWORD addr = (DWORD)addressValue; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = RadiusAttr::VendorSpecific; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_vendorId, vendorId); - attr->m_vendorType = vendorType; - attr->m_vendorLength = 4 + 2; - attr->m_vendorValue[0] = ((const BYTE*)&addr)[0]; - attr->m_vendorValue[1] = ((const BYTE*)&addr)[1]; - attr->m_vendorValue[2] = ((const BYTE*)&addr)[2]; - attr->m_vendorValue[3] = ((const BYTE*)&addr)[3]; + attr->s.m_type = RadiusAttr::VendorSpecific; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.s.m_vendorId, vendorId); + attr->s.s.m_vendorType = vendorType; + attr->s.s.m_vendorLength = 4 + 2; + attr->s.s.m_vendorValue[0] = ((const BYTE*)&addr)[0]; + attr->s.s.m_vendorValue[1] = ((const BYTE*)&addr)[1]; + attr->s.s.m_vendorValue[2] = ((const BYTE*)&addr)[2]; + attr->s.s.m_vendorValue[3] = ((const BYTE*)&addr)[3]; SetLength(len + attrLen); return true; @@ -1130,11 +1161,11 @@ bool RadiusPDU::AppendCiscoAttr( return false; RadiusAttr* const attr = reinterpret_cast(m_data + len); - attr->m_type = RadiusAttr::VendorSpecific; - attr->m_length = attrLen; - SetRadiusInteger(attr->m_vendorId, RadiusAttr::CiscoVendorId); - attr->m_vendorType = vendorType; - attr->m_vendorLength = 2; + attr->s.m_type = RadiusAttr::VendorSpecific; + attr->s.m_length = attrLen; + SetRadiusInteger(attr->s.s.m_vendorId, RadiusAttr::CiscoVendorId); + attr->s.s.m_vendorType = vendorType; + attr->s.s.m_vendorLength = 2; if (!vsaHack) { int i = 0; @@ -1143,26 +1174,26 @@ bool RadiusPDU::AppendCiscoAttr( attrLen += CiscoAttrNames[i].m_nameLen + 1; if ((len + attrLen) > MaxPduLength) return false; - memcpy(attr->m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen); - attr->m_length = attr->m_length + memcpy(attr->s.s.m_vendorValue, CiscoAttrNames[i].m_name, CiscoAttrNames[i].m_nameLen); + attr->s.m_length = attr->s.m_length + (unsigned char)CiscoAttrNames[i].m_nameLen; - attr->m_vendorLength = attr->m_vendorLength + attr->s.s.m_vendorLength = attr->s.s.m_vendorLength + (unsigned char)CiscoAttrNames[i].m_nameLen; - attr->m_data[attr->m_length++] = '='; - attr->m_vendorLength++; + attr->m_data[attr->s.m_length++] = '='; + attr->s.s.m_vendorLength++; break; } else i++; } const PINDEX strLen = stringValue.GetLength(); attrLen += strLen; - if (((PINDEX)attr->m_length + strLen) > RadiusAttr::MaxLength + if (((PINDEX)attr->s.m_length + strLen) > RadiusAttr::MaxLength || (len + attrLen) > MaxPduLength) return false; - memcpy(attr->m_data + (PINDEX)attr->m_length, (const char*)stringValue, strLen); - attr->m_length = attr->m_length + (unsigned char)strLen; - attr->m_vendorLength = attr->m_vendorLength + (unsigned char)strLen; + memcpy(attr->m_data + (PINDEX)attr->s.m_length, (const char*)stringValue, strLen); + attr->s.m_length = attr->s.m_length + (unsigned char)strLen; + attr->s.s.m_vendorLength = attr->s.s.m_vendorLength + (unsigned char)strLen; SetLength(len + attrLen); return true; @@ -1247,7 +1278,7 @@ bool RadiusPDU::Read(const void* rawData PAssert(rawLength >= MinPduLength, PInvalidParameter); #endif - m_code = m_id = Invalid; + s.m_code = s.m_id = Invalid; SetLength(FixedHeaderLength); if (rawData == NULL || rawLength < MinPduLength) @@ -1260,13 +1291,13 @@ bool RadiusPDU::Read(const void* rawData const PINDEX length = GetLength(); if (length > rawLength || length < MinPduLength || length > MaxPduLength) { - m_code = m_id = Invalid; + s.m_code = s.m_id = Invalid; SetLength(FixedHeaderLength); return false; } if (length > FixedHeaderLength) { - memcpy(m_attributes, buffptr, length - FixedHeaderLength); + memcpy(s.m_attributes, buffptr, length - FixedHeaderLength); } return true; @@ -1291,13 +1322,13 @@ void RadiusPDU::CopyContents(const Radiu const PINDEX len = GetLength(); if (len < MinPduLength || len > MaxPduLength) { - m_code = m_id = Invalid; + s.m_code = s.m_id = Invalid; SetLength(FixedHeaderLength); return; } if (len > FixedHeaderLength) - memcpy(m_attributes, pdu.m_attributes, len - FixedHeaderLength); + memcpy(s.m_attributes, pdu.s.m_attributes, len - FixedHeaderLength); } bool RadiusPDU::EncryptPasswords( @@ -1316,7 +1347,7 @@ bool RadiusPDU::EncryptPasswords( md5.Start(); if (secretLength > 0) md5.Process((const char*)secret, secretLength); - md5.Process(m_authenticator, AuthenticatorLength); + md5.Process(s.m_authenticator, AuthenticatorLength); md5.CompleteDigest(digest); // calculate length of the new and the old User-Password value @@ -1330,14 +1361,14 @@ bool RadiusPDU::EncryptPasswords( // the encrypted password attribute will be appended as the last attribute RadiusAttr* const encPwdAttr = reinterpret_cast(m_data + len); - encPwdAttr->m_type = RadiusAttr::UserPassword; - encPwdAttr->m_length = encPwdLength + RadiusAttr::FixedHeaderLength; - memset(encPwdAttr->m_value, 0, encPwdLength); + encPwdAttr->s.m_type = RadiusAttr::UserPassword; + encPwdAttr->s.m_length = encPwdLength + RadiusAttr::FixedHeaderLength; + memset(encPwdAttr->s.m_value, 0, encPwdLength); if (origPwdLength > 0) - memcpy(encPwdAttr->m_value, pwdAttr->m_value, origPwdLength); + memcpy(encPwdAttr->s.m_value, pwdAttr->s.m_value, origPwdLength); // encrypt first 16 bytes of the password - DWORD* buf1ptr = reinterpret_cast(encPwdAttr->m_value); + DWORD* buf1ptr = reinterpret_cast(encPwdAttr->s.m_value); const DWORD* buf2ptr = reinterpret_cast(digest.GetPointer()); // XOR either byte-wise or dword-wise (if the memory block is aligned properly)