BOOLEAN VmDnsValidateSrvRecord( PVMDNS_RECORD pRecord ) { return VmDnsValidateRecordCommon(pRecord) && VmDnsStringLenA(pRecord->Data.SRV.pNameTarget) <= VMDNS_NAME_LENGTH_MAX; }
BOOLEAN VmDnsValidateRecordCommon( PVMDNS_RECORD pRecord ) { if (pRecord && VmDnsStringLenA(pRecord->pszName) <= VMDNS_NAME_LENGTH_MAX && pRecord->iClass == VMDNS_CLASS_IN) { return TRUE; } return FALSE; }
DWORD VmDnsWriteDomainNameStringToBuffer( PSTR pszDomainName, PVMDNS_MESSAGE_BUFFER pVmDnsBuffer ) { DWORD dwError = 0; DWORD dwStringLength = 0; if (!pszDomainName || !pVmDnsBuffer ) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwStringLength = VmDnsStringLenA(pszDomainName); if (dwStringLength > VMDNS_NAME_LENGTH_MAX) { dwError = ERROR_LABEL_TOO_LONG; BAIL_ON_VMDNS_ERROR(dwError); } if (dwStringLength) { dwError = VmDnsWriteStringToBuffer( pszDomainName, dwStringLength, pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsWriteCharToBuffer( 0, pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); cleanup: return dwError; error: goto cleanup; }
DWORD VmDnsWriteDomainNameLabelsToBuffer( PSTR pszDomainName, PVMDNS_MESSAGE_BUFFER pVmDnsBuffer ) { DWORD dwError = 0; PSTR pszTempString = NULL; PSTR pToken = NULL; PSTR pNextToken = NULL; DWORD dwTotalStringLength = 0; if (!pszDomainName || !pVmDnsBuffer ) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsAllocateStringA( pszDomainName, &pszTempString ); BAIL_ON_VMDNS_ERROR(dwError); pToken = VmDnsStringTokA( pszTempString, ".", &pNextToken ); while(pToken) { DWORD dwStringLength = 0; dwStringLength = VmDnsStringLenA(pToken); if (dwStringLength > VMDNS_LABEL_LENGTH_MAX) { dwError = ERROR_LABEL_TOO_LONG; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsWriteStringToBuffer( pToken, dwStringLength, pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); dwTotalStringLength += dwStringLength+1; if (dwTotalStringLength > VMDNS_NAME_LENGTH_MAX) { dwError = ERROR_LABEL_TOO_LONG; BAIL_ON_VMDNS_ERROR(dwError); } pToken = VmDnsStringTokA( NULL, ".", &pNextToken ); } if (++dwTotalStringLength > VMDNS_NAME_LENGTH_MAX) { dwError = ERROR_LABEL_TOO_LONG; BAIL_ON_VMDNS_ERROR(dwError); } dwError = VmDnsWriteCharToBuffer( 0, pVmDnsBuffer ); BAIL_ON_VMDNS_ERROR(dwError); cleanup: VMDNS_SAFE_FREE_STRINGA(pszTempString); return dwError; error: goto cleanup; }
DWORD VmDnsGetDomainNameLength( PSTR pszDomainName, PUINT16 puSize, BOOL bTokenizeDomainName ) { DWORD dwError = 0; PSTR pszTempString = NULL; PSTR pToken = NULL; PSTR pNextToken = NULL; UINT16 uTotalStringLength = 0; if (!puSize) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_VMDNS_ERROR(dwError); } if (bTokenizeDomainName) { dwError = VmDnsAllocateStringA( pszDomainName, &pszTempString ); BAIL_ON_VMDNS_ERROR(dwError); pToken = VmDnsStringTokA( pszTempString, ".", &pNextToken ); while(++uTotalStringLength && pToken) { UINT16 uStringLength = 0; uStringLength = VmDnsStringLenA(pToken); uTotalStringLength += uStringLength; pToken = VmDnsStringTokA( NULL, ".", &pNextToken ); } } else { uTotalStringLength = VmDnsStringLenA(pszDomainName) + 1; } *puSize = uTotalStringLength; cleanup: VMDNS_SAFE_FREE_STRINGA(pszTempString); return dwError; error: if (puSize) { *puSize = 0; } goto cleanup; }