1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/base/dns_util.h" 6 7 #include <cstring> 8 9 namespace net { 10 11 // Based on DJB's public domain code. DNSDomainFromDot(const std::string & dotted,std::string * out)12bool DNSDomainFromDot(const std::string& dotted, std::string* out) { 13 const char* buf = dotted.data(); 14 unsigned n = dotted.size(); 15 char label[63]; 16 unsigned int labellen = 0; /* <= sizeof label */ 17 char name[255]; 18 unsigned int namelen = 0; /* <= sizeof name */ 19 char ch; 20 21 for (;;) { 22 if (!n) 23 break; 24 ch = *buf++; 25 --n; 26 if (ch == '.') { 27 if (labellen) { 28 if (namelen + labellen + 1 > sizeof name) 29 return false; 30 name[namelen++] = labellen; 31 memcpy(name + namelen, label, labellen); 32 namelen += labellen; 33 labellen = 0; 34 } 35 continue; 36 } 37 if (labellen >= sizeof label) 38 return false; 39 label[labellen++] = ch; 40 } 41 42 if (labellen) { 43 if (namelen + labellen + 1 > sizeof name) 44 return false; 45 name[namelen++] = labellen; 46 memcpy(name + namelen, label, labellen); 47 namelen += labellen; 48 labellen = 0; 49 } 50 51 if (namelen + 1 > sizeof name) 52 return false; 53 name[namelen++] = 0; 54 55 *out = name; 56 return true; 57 } 58 IsSTD3ASCIIValidCharacter(char c)59bool IsSTD3ASCIIValidCharacter(char c) { 60 if (c <= 0x2c) 61 return false; 62 if (c >= 0x7b) 63 return false; 64 if (c >= 0x2e && c <= 0x2f) 65 return false; 66 if (c >= 0x3a && c <= 0x40) 67 return false; 68 if (c >= 0x5b && c <= 0x60) 69 return false; 70 return true; 71 } 72 73 } // namespace net 74