scan_rr.go 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897
  1. package dns
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "errors"
  6. "net"
  7. "strconv"
  8. "strings"
  9. )
  10. // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)
  11. // or an error
  12. func endingToString(c *zlexer, errstr string) (string, *ParseError) {
  13. var buffer bytes.Buffer
  14. l, _ := c.Next() // zString
  15. for l.value != zNewline && l.value != zEOF {
  16. if l.err {
  17. return buffer.String(), &ParseError{"", errstr, l}
  18. }
  19. switch l.value {
  20. case zString:
  21. buffer.WriteString(l.token)
  22. case zBlank: // Ok
  23. default:
  24. return "", &ParseError{"", errstr, l}
  25. }
  26. l, _ = c.Next()
  27. }
  28. return buffer.String(), nil
  29. }
  30. // A remainder of the rdata with embedded spaces, split on unquoted whitespace
  31. // and return the parsed string slice or an error
  32. func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) {
  33. // Get the remaining data until we see a zNewline
  34. l, _ := c.Next()
  35. if l.err {
  36. return nil, &ParseError{"", errstr, l}
  37. }
  38. // Build the slice
  39. s := make([]string, 0)
  40. quote := false
  41. empty := false
  42. for l.value != zNewline && l.value != zEOF {
  43. if l.err {
  44. return nil, &ParseError{"", errstr, l}
  45. }
  46. switch l.value {
  47. case zString:
  48. empty = false
  49. if len(l.token) > 255 {
  50. // split up tokens that are larger than 255 into 255-chunks
  51. sx := []string{}
  52. p, i := 0, 255
  53. for {
  54. if i <= len(l.token) {
  55. sx = append(sx, l.token[p:i])
  56. } else {
  57. sx = append(sx, l.token[p:])
  58. break
  59. }
  60. p, i = p+255, i+255
  61. }
  62. s = append(s, sx...)
  63. break
  64. }
  65. s = append(s, l.token)
  66. case zBlank:
  67. if quote {
  68. // zBlank can only be seen in between txt parts.
  69. return nil, &ParseError{"", errstr, l}
  70. }
  71. case zQuote:
  72. if empty && quote {
  73. s = append(s, "")
  74. }
  75. quote = !quote
  76. empty = true
  77. default:
  78. return nil, &ParseError{"", errstr, l}
  79. }
  80. l, _ = c.Next()
  81. }
  82. if quote {
  83. return nil, &ParseError{"", errstr, l}
  84. }
  85. return s, nil
  86. }
  87. func (rr *A) parse(c *zlexer, o string) *ParseError {
  88. l, _ := c.Next()
  89. rr.A = net.ParseIP(l.token)
  90. // IPv4 addresses cannot include ":".
  91. // We do this rather than use net.IP's To4() because
  92. // To4() treats IPv4-mapped IPv6 addresses as being
  93. // IPv4.
  94. isIPv4 := !strings.Contains(l.token, ":")
  95. if rr.A == nil || !isIPv4 || l.err {
  96. return &ParseError{"", "bad A A", l}
  97. }
  98. return slurpRemainder(c)
  99. }
  100. func (rr *AAAA) parse(c *zlexer, o string) *ParseError {
  101. l, _ := c.Next()
  102. rr.AAAA = net.ParseIP(l.token)
  103. // IPv6 addresses must include ":", and IPv4
  104. // addresses cannot include ":".
  105. isIPv6 := strings.Contains(l.token, ":")
  106. if rr.AAAA == nil || !isIPv6 || l.err {
  107. return &ParseError{"", "bad AAAA AAAA", l}
  108. }
  109. return slurpRemainder(c)
  110. }
  111. func (rr *NS) parse(c *zlexer, o string) *ParseError {
  112. l, _ := c.Next()
  113. name, nameOk := toAbsoluteName(l.token, o)
  114. if l.err || !nameOk {
  115. return &ParseError{"", "bad NS Ns", l}
  116. }
  117. rr.Ns = name
  118. return slurpRemainder(c)
  119. }
  120. func (rr *PTR) parse(c *zlexer, o string) *ParseError {
  121. l, _ := c.Next()
  122. name, nameOk := toAbsoluteName(l.token, o)
  123. if l.err || !nameOk {
  124. return &ParseError{"", "bad PTR Ptr", l}
  125. }
  126. rr.Ptr = name
  127. return slurpRemainder(c)
  128. }
  129. func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError {
  130. l, _ := c.Next()
  131. name, nameOk := toAbsoluteName(l.token, o)
  132. if l.err || !nameOk {
  133. return &ParseError{"", "bad NSAP-PTR Ptr", l}
  134. }
  135. rr.Ptr = name
  136. return slurpRemainder(c)
  137. }
  138. func (rr *RP) parse(c *zlexer, o string) *ParseError {
  139. l, _ := c.Next()
  140. mbox, mboxOk := toAbsoluteName(l.token, o)
  141. if l.err || !mboxOk {
  142. return &ParseError{"", "bad RP Mbox", l}
  143. }
  144. rr.Mbox = mbox
  145. c.Next() // zBlank
  146. l, _ = c.Next()
  147. rr.Txt = l.token
  148. txt, txtOk := toAbsoluteName(l.token, o)
  149. if l.err || !txtOk {
  150. return &ParseError{"", "bad RP Txt", l}
  151. }
  152. rr.Txt = txt
  153. return slurpRemainder(c)
  154. }
  155. func (rr *MR) parse(c *zlexer, o string) *ParseError {
  156. l, _ := c.Next()
  157. name, nameOk := toAbsoluteName(l.token, o)
  158. if l.err || !nameOk {
  159. return &ParseError{"", "bad MR Mr", l}
  160. }
  161. rr.Mr = name
  162. return slurpRemainder(c)
  163. }
  164. func (rr *MB) parse(c *zlexer, o string) *ParseError {
  165. l, _ := c.Next()
  166. name, nameOk := toAbsoluteName(l.token, o)
  167. if l.err || !nameOk {
  168. return &ParseError{"", "bad MB Mb", l}
  169. }
  170. rr.Mb = name
  171. return slurpRemainder(c)
  172. }
  173. func (rr *MG) parse(c *zlexer, o string) *ParseError {
  174. l, _ := c.Next()
  175. name, nameOk := toAbsoluteName(l.token, o)
  176. if l.err || !nameOk {
  177. return &ParseError{"", "bad MG Mg", l}
  178. }
  179. rr.Mg = name
  180. return slurpRemainder(c)
  181. }
  182. func (rr *HINFO) parse(c *zlexer, o string) *ParseError {
  183. chunks, e := endingToTxtSlice(c, "bad HINFO Fields")
  184. if e != nil {
  185. return e
  186. }
  187. if ln := len(chunks); ln == 0 {
  188. return nil
  189. } else if ln == 1 {
  190. // Can we split it?
  191. if out := strings.Fields(chunks[0]); len(out) > 1 {
  192. chunks = out
  193. } else {
  194. chunks = append(chunks, "")
  195. }
  196. }
  197. rr.Cpu = chunks[0]
  198. rr.Os = strings.Join(chunks[1:], " ")
  199. return nil
  200. }
  201. func (rr *MINFO) parse(c *zlexer, o string) *ParseError {
  202. l, _ := c.Next()
  203. rmail, rmailOk := toAbsoluteName(l.token, o)
  204. if l.err || !rmailOk {
  205. return &ParseError{"", "bad MINFO Rmail", l}
  206. }
  207. rr.Rmail = rmail
  208. c.Next() // zBlank
  209. l, _ = c.Next()
  210. rr.Email = l.token
  211. email, emailOk := toAbsoluteName(l.token, o)
  212. if l.err || !emailOk {
  213. return &ParseError{"", "bad MINFO Email", l}
  214. }
  215. rr.Email = email
  216. return slurpRemainder(c)
  217. }
  218. func (rr *MF) parse(c *zlexer, o string) *ParseError {
  219. l, _ := c.Next()
  220. name, nameOk := toAbsoluteName(l.token, o)
  221. if l.err || !nameOk {
  222. return &ParseError{"", "bad MF Mf", l}
  223. }
  224. rr.Mf = name
  225. return slurpRemainder(c)
  226. }
  227. func (rr *MD) parse(c *zlexer, o string) *ParseError {
  228. l, _ := c.Next()
  229. name, nameOk := toAbsoluteName(l.token, o)
  230. if l.err || !nameOk {
  231. return &ParseError{"", "bad MD Md", l}
  232. }
  233. rr.Md = name
  234. return slurpRemainder(c)
  235. }
  236. func (rr *MX) parse(c *zlexer, o string) *ParseError {
  237. l, _ := c.Next()
  238. i, e := strconv.ParseUint(l.token, 10, 16)
  239. if e != nil || l.err {
  240. return &ParseError{"", "bad MX Pref", l}
  241. }
  242. rr.Preference = uint16(i)
  243. c.Next() // zBlank
  244. l, _ = c.Next() // zString
  245. rr.Mx = l.token
  246. name, nameOk := toAbsoluteName(l.token, o)
  247. if l.err || !nameOk {
  248. return &ParseError{"", "bad MX Mx", l}
  249. }
  250. rr.Mx = name
  251. return slurpRemainder(c)
  252. }
  253. func (rr *RT) parse(c *zlexer, o string) *ParseError {
  254. l, _ := c.Next()
  255. i, e := strconv.ParseUint(l.token, 10, 16)
  256. if e != nil {
  257. return &ParseError{"", "bad RT Preference", l}
  258. }
  259. rr.Preference = uint16(i)
  260. c.Next() // zBlank
  261. l, _ = c.Next() // zString
  262. rr.Host = l.token
  263. name, nameOk := toAbsoluteName(l.token, o)
  264. if l.err || !nameOk {
  265. return &ParseError{"", "bad RT Host", l}
  266. }
  267. rr.Host = name
  268. return slurpRemainder(c)
  269. }
  270. func (rr *AFSDB) parse(c *zlexer, o string) *ParseError {
  271. l, _ := c.Next()
  272. i, e := strconv.ParseUint(l.token, 10, 16)
  273. if e != nil || l.err {
  274. return &ParseError{"", "bad AFSDB Subtype", l}
  275. }
  276. rr.Subtype = uint16(i)
  277. c.Next() // zBlank
  278. l, _ = c.Next() // zString
  279. rr.Hostname = l.token
  280. name, nameOk := toAbsoluteName(l.token, o)
  281. if l.err || !nameOk {
  282. return &ParseError{"", "bad AFSDB Hostname", l}
  283. }
  284. rr.Hostname = name
  285. return slurpRemainder(c)
  286. }
  287. func (rr *X25) parse(c *zlexer, o string) *ParseError {
  288. l, _ := c.Next()
  289. if l.err {
  290. return &ParseError{"", "bad X25 PSDNAddress", l}
  291. }
  292. rr.PSDNAddress = l.token
  293. return slurpRemainder(c)
  294. }
  295. func (rr *KX) parse(c *zlexer, o string) *ParseError {
  296. l, _ := c.Next()
  297. i, e := strconv.ParseUint(l.token, 10, 16)
  298. if e != nil || l.err {
  299. return &ParseError{"", "bad KX Pref", l}
  300. }
  301. rr.Preference = uint16(i)
  302. c.Next() // zBlank
  303. l, _ = c.Next() // zString
  304. rr.Exchanger = l.token
  305. name, nameOk := toAbsoluteName(l.token, o)
  306. if l.err || !nameOk {
  307. return &ParseError{"", "bad KX Exchanger", l}
  308. }
  309. rr.Exchanger = name
  310. return slurpRemainder(c)
  311. }
  312. func (rr *CNAME) parse(c *zlexer, o string) *ParseError {
  313. l, _ := c.Next()
  314. name, nameOk := toAbsoluteName(l.token, o)
  315. if l.err || !nameOk {
  316. return &ParseError{"", "bad CNAME Target", l}
  317. }
  318. rr.Target = name
  319. return slurpRemainder(c)
  320. }
  321. func (rr *DNAME) parse(c *zlexer, o string) *ParseError {
  322. l, _ := c.Next()
  323. name, nameOk := toAbsoluteName(l.token, o)
  324. if l.err || !nameOk {
  325. return &ParseError{"", "bad DNAME Target", l}
  326. }
  327. rr.Target = name
  328. return slurpRemainder(c)
  329. }
  330. func (rr *SOA) parse(c *zlexer, o string) *ParseError {
  331. l, _ := c.Next()
  332. ns, nsOk := toAbsoluteName(l.token, o)
  333. if l.err || !nsOk {
  334. return &ParseError{"", "bad SOA Ns", l}
  335. }
  336. rr.Ns = ns
  337. c.Next() // zBlank
  338. l, _ = c.Next()
  339. rr.Mbox = l.token
  340. mbox, mboxOk := toAbsoluteName(l.token, o)
  341. if l.err || !mboxOk {
  342. return &ParseError{"", "bad SOA Mbox", l}
  343. }
  344. rr.Mbox = mbox
  345. c.Next() // zBlank
  346. var (
  347. v uint32
  348. ok bool
  349. )
  350. for i := 0; i < 5; i++ {
  351. l, _ = c.Next()
  352. if l.err {
  353. return &ParseError{"", "bad SOA zone parameter", l}
  354. }
  355. if j, err := strconv.ParseUint(l.token, 10, 32); err != nil {
  356. if i == 0 {
  357. // Serial must be a number
  358. return &ParseError{"", "bad SOA zone parameter", l}
  359. }
  360. // We allow other fields to be unitful duration strings
  361. if v, ok = stringToTTL(l.token); !ok {
  362. return &ParseError{"", "bad SOA zone parameter", l}
  363. }
  364. } else {
  365. v = uint32(j)
  366. }
  367. switch i {
  368. case 0:
  369. rr.Serial = v
  370. c.Next() // zBlank
  371. case 1:
  372. rr.Refresh = v
  373. c.Next() // zBlank
  374. case 2:
  375. rr.Retry = v
  376. c.Next() // zBlank
  377. case 3:
  378. rr.Expire = v
  379. c.Next() // zBlank
  380. case 4:
  381. rr.Minttl = v
  382. }
  383. }
  384. return slurpRemainder(c)
  385. }
  386. func (rr *SRV) parse(c *zlexer, o string) *ParseError {
  387. l, _ := c.Next()
  388. i, e := strconv.ParseUint(l.token, 10, 16)
  389. if e != nil || l.err {
  390. return &ParseError{"", "bad SRV Priority", l}
  391. }
  392. rr.Priority = uint16(i)
  393. c.Next() // zBlank
  394. l, _ = c.Next() // zString
  395. i, e1 := strconv.ParseUint(l.token, 10, 16)
  396. if e1 != nil || l.err {
  397. return &ParseError{"", "bad SRV Weight", l}
  398. }
  399. rr.Weight = uint16(i)
  400. c.Next() // zBlank
  401. l, _ = c.Next() // zString
  402. i, e2 := strconv.ParseUint(l.token, 10, 16)
  403. if e2 != nil || l.err {
  404. return &ParseError{"", "bad SRV Port", l}
  405. }
  406. rr.Port = uint16(i)
  407. c.Next() // zBlank
  408. l, _ = c.Next() // zString
  409. rr.Target = l.token
  410. name, nameOk := toAbsoluteName(l.token, o)
  411. if l.err || !nameOk {
  412. return &ParseError{"", "bad SRV Target", l}
  413. }
  414. rr.Target = name
  415. return slurpRemainder(c)
  416. }
  417. func (rr *NAPTR) parse(c *zlexer, o string) *ParseError {
  418. l, _ := c.Next()
  419. i, e := strconv.ParseUint(l.token, 10, 16)
  420. if e != nil || l.err {
  421. return &ParseError{"", "bad NAPTR Order", l}
  422. }
  423. rr.Order = uint16(i)
  424. c.Next() // zBlank
  425. l, _ = c.Next() // zString
  426. i, e1 := strconv.ParseUint(l.token, 10, 16)
  427. if e1 != nil || l.err {
  428. return &ParseError{"", "bad NAPTR Preference", l}
  429. }
  430. rr.Preference = uint16(i)
  431. // Flags
  432. c.Next() // zBlank
  433. l, _ = c.Next() // _QUOTE
  434. if l.value != zQuote {
  435. return &ParseError{"", "bad NAPTR Flags", l}
  436. }
  437. l, _ = c.Next() // Either String or Quote
  438. if l.value == zString {
  439. rr.Flags = l.token
  440. l, _ = c.Next() // _QUOTE
  441. if l.value != zQuote {
  442. return &ParseError{"", "bad NAPTR Flags", l}
  443. }
  444. } else if l.value == zQuote {
  445. rr.Flags = ""
  446. } else {
  447. return &ParseError{"", "bad NAPTR Flags", l}
  448. }
  449. // Service
  450. c.Next() // zBlank
  451. l, _ = c.Next() // _QUOTE
  452. if l.value != zQuote {
  453. return &ParseError{"", "bad NAPTR Service", l}
  454. }
  455. l, _ = c.Next() // Either String or Quote
  456. if l.value == zString {
  457. rr.Service = l.token
  458. l, _ = c.Next() // _QUOTE
  459. if l.value != zQuote {
  460. return &ParseError{"", "bad NAPTR Service", l}
  461. }
  462. } else if l.value == zQuote {
  463. rr.Service = ""
  464. } else {
  465. return &ParseError{"", "bad NAPTR Service", l}
  466. }
  467. // Regexp
  468. c.Next() // zBlank
  469. l, _ = c.Next() // _QUOTE
  470. if l.value != zQuote {
  471. return &ParseError{"", "bad NAPTR Regexp", l}
  472. }
  473. l, _ = c.Next() // Either String or Quote
  474. if l.value == zString {
  475. rr.Regexp = l.token
  476. l, _ = c.Next() // _QUOTE
  477. if l.value != zQuote {
  478. return &ParseError{"", "bad NAPTR Regexp", l}
  479. }
  480. } else if l.value == zQuote {
  481. rr.Regexp = ""
  482. } else {
  483. return &ParseError{"", "bad NAPTR Regexp", l}
  484. }
  485. // After quote no space??
  486. c.Next() // zBlank
  487. l, _ = c.Next() // zString
  488. rr.Replacement = l.token
  489. name, nameOk := toAbsoluteName(l.token, o)
  490. if l.err || !nameOk {
  491. return &ParseError{"", "bad NAPTR Replacement", l}
  492. }
  493. rr.Replacement = name
  494. return slurpRemainder(c)
  495. }
  496. func (rr *TALINK) parse(c *zlexer, o string) *ParseError {
  497. l, _ := c.Next()
  498. previousName, previousNameOk := toAbsoluteName(l.token, o)
  499. if l.err || !previousNameOk {
  500. return &ParseError{"", "bad TALINK PreviousName", l}
  501. }
  502. rr.PreviousName = previousName
  503. c.Next() // zBlank
  504. l, _ = c.Next()
  505. rr.NextName = l.token
  506. nextName, nextNameOk := toAbsoluteName(l.token, o)
  507. if l.err || !nextNameOk {
  508. return &ParseError{"", "bad TALINK NextName", l}
  509. }
  510. rr.NextName = nextName
  511. return slurpRemainder(c)
  512. }
  513. func (rr *LOC) parse(c *zlexer, o string) *ParseError {
  514. // Non zero defaults for LOC record, see RFC 1876, Section 3.
  515. rr.Size = 0x12 // 1e2 cm (1m)
  516. rr.HorizPre = 0x16 // 1e6 cm (10000m)
  517. rr.VertPre = 0x13 // 1e3 cm (10m)
  518. ok := false
  519. // North
  520. l, _ := c.Next()
  521. i, e := strconv.ParseUint(l.token, 10, 32)
  522. if e != nil || l.err || i > 90 {
  523. return &ParseError{"", "bad LOC Latitude", l}
  524. }
  525. rr.Latitude = 1000 * 60 * 60 * uint32(i)
  526. c.Next() // zBlank
  527. // Either number, 'N' or 'S'
  528. l, _ = c.Next()
  529. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  530. goto East
  531. }
  532. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 {
  533. return &ParseError{"", "bad LOC Latitude minutes", l}
  534. } else {
  535. rr.Latitude += 1000 * 60 * uint32(i)
  536. }
  537. c.Next() // zBlank
  538. l, _ = c.Next()
  539. if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 {
  540. return &ParseError{"", "bad LOC Latitude seconds", l}
  541. } else {
  542. rr.Latitude += uint32(1000 * i)
  543. }
  544. c.Next() // zBlank
  545. // Either number, 'N' or 'S'
  546. l, _ = c.Next()
  547. if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok {
  548. goto East
  549. }
  550. // If still alive, flag an error
  551. return &ParseError{"", "bad LOC Latitude North/South", l}
  552. East:
  553. // East
  554. c.Next() // zBlank
  555. l, _ = c.Next()
  556. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 180 {
  557. return &ParseError{"", "bad LOC Longitude", l}
  558. } else {
  559. rr.Longitude = 1000 * 60 * 60 * uint32(i)
  560. }
  561. c.Next() // zBlank
  562. // Either number, 'E' or 'W'
  563. l, _ = c.Next()
  564. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  565. goto Altitude
  566. }
  567. if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 {
  568. return &ParseError{"", "bad LOC Longitude minutes", l}
  569. } else {
  570. rr.Longitude += 1000 * 60 * uint32(i)
  571. }
  572. c.Next() // zBlank
  573. l, _ = c.Next()
  574. if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 {
  575. return &ParseError{"", "bad LOC Longitude seconds", l}
  576. } else {
  577. rr.Longitude += uint32(1000 * i)
  578. }
  579. c.Next() // zBlank
  580. // Either number, 'E' or 'W'
  581. l, _ = c.Next()
  582. if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok {
  583. goto Altitude
  584. }
  585. // If still alive, flag an error
  586. return &ParseError{"", "bad LOC Longitude East/West", l}
  587. Altitude:
  588. c.Next() // zBlank
  589. l, _ = c.Next()
  590. if l.token == "" || l.err {
  591. return &ParseError{"", "bad LOC Altitude", l}
  592. }
  593. if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' {
  594. l.token = l.token[0 : len(l.token)-1]
  595. }
  596. if i, err := strconv.ParseFloat(l.token, 64); err != nil {
  597. return &ParseError{"", "bad LOC Altitude", l}
  598. } else {
  599. rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5)
  600. }
  601. // And now optionally the other values
  602. l, _ = c.Next()
  603. count := 0
  604. for l.value != zNewline && l.value != zEOF {
  605. switch l.value {
  606. case zString:
  607. switch count {
  608. case 0: // Size
  609. exp, m, ok := stringToCm(l.token)
  610. if !ok {
  611. return &ParseError{"", "bad LOC Size", l}
  612. }
  613. rr.Size = exp&0x0f | m<<4&0xf0
  614. case 1: // HorizPre
  615. exp, m, ok := stringToCm(l.token)
  616. if !ok {
  617. return &ParseError{"", "bad LOC HorizPre", l}
  618. }
  619. rr.HorizPre = exp&0x0f | m<<4&0xf0
  620. case 2: // VertPre
  621. exp, m, ok := stringToCm(l.token)
  622. if !ok {
  623. return &ParseError{"", "bad LOC VertPre", l}
  624. }
  625. rr.VertPre = exp&0x0f | m<<4&0xf0
  626. }
  627. count++
  628. case zBlank:
  629. // Ok
  630. default:
  631. return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l}
  632. }
  633. l, _ = c.Next()
  634. }
  635. return nil
  636. }
  637. func (rr *HIP) parse(c *zlexer, o string) *ParseError {
  638. // HitLength is not represented
  639. l, _ := c.Next()
  640. i, e := strconv.ParseUint(l.token, 10, 8)
  641. if e != nil || l.err {
  642. return &ParseError{"", "bad HIP PublicKeyAlgorithm", l}
  643. }
  644. rr.PublicKeyAlgorithm = uint8(i)
  645. c.Next() // zBlank
  646. l, _ = c.Next() // zString
  647. if l.token == "" || l.err {
  648. return &ParseError{"", "bad HIP Hit", l}
  649. }
  650. rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6.
  651. rr.HitLength = uint8(len(rr.Hit)) / 2
  652. c.Next() // zBlank
  653. l, _ = c.Next() // zString
  654. if l.token == "" || l.err {
  655. return &ParseError{"", "bad HIP PublicKey", l}
  656. }
  657. rr.PublicKey = l.token // This cannot contain spaces
  658. decodedPK, decodedPKerr := base64.StdEncoding.DecodeString(rr.PublicKey)
  659. if decodedPKerr != nil {
  660. return &ParseError{"", "bad HIP PublicKey", l}
  661. }
  662. rr.PublicKeyLength = uint16(len(decodedPK))
  663. // RendezvousServers (if any)
  664. l, _ = c.Next()
  665. var xs []string
  666. for l.value != zNewline && l.value != zEOF {
  667. switch l.value {
  668. case zString:
  669. name, nameOk := toAbsoluteName(l.token, o)
  670. if l.err || !nameOk {
  671. return &ParseError{"", "bad HIP RendezvousServers", l}
  672. }
  673. xs = append(xs, name)
  674. case zBlank:
  675. // Ok
  676. default:
  677. return &ParseError{"", "bad HIP RendezvousServers", l}
  678. }
  679. l, _ = c.Next()
  680. }
  681. rr.RendezvousServers = xs
  682. return nil
  683. }
  684. func (rr *CERT) parse(c *zlexer, o string) *ParseError {
  685. l, _ := c.Next()
  686. if v, ok := StringToCertType[l.token]; ok {
  687. rr.Type = v
  688. } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil {
  689. return &ParseError{"", "bad CERT Type", l}
  690. } else {
  691. rr.Type = uint16(i)
  692. }
  693. c.Next() // zBlank
  694. l, _ = c.Next() // zString
  695. i, e := strconv.ParseUint(l.token, 10, 16)
  696. if e != nil || l.err {
  697. return &ParseError{"", "bad CERT KeyTag", l}
  698. }
  699. rr.KeyTag = uint16(i)
  700. c.Next() // zBlank
  701. l, _ = c.Next() // zString
  702. if v, ok := StringToAlgorithm[l.token]; ok {
  703. rr.Algorithm = v
  704. } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  705. return &ParseError{"", "bad CERT Algorithm", l}
  706. } else {
  707. rr.Algorithm = uint8(i)
  708. }
  709. s, e1 := endingToString(c, "bad CERT Certificate")
  710. if e1 != nil {
  711. return e1
  712. }
  713. rr.Certificate = s
  714. return nil
  715. }
  716. func (rr *OPENPGPKEY) parse(c *zlexer, o string) *ParseError {
  717. s, e := endingToString(c, "bad OPENPGPKEY PublicKey")
  718. if e != nil {
  719. return e
  720. }
  721. rr.PublicKey = s
  722. return nil
  723. }
  724. func (rr *CSYNC) parse(c *zlexer, o string) *ParseError {
  725. l, _ := c.Next()
  726. j, e := strconv.ParseUint(l.token, 10, 32)
  727. if e != nil {
  728. // Serial must be a number
  729. return &ParseError{"", "bad CSYNC serial", l}
  730. }
  731. rr.Serial = uint32(j)
  732. c.Next() // zBlank
  733. l, _ = c.Next()
  734. j, e1 := strconv.ParseUint(l.token, 10, 16)
  735. if e1 != nil {
  736. // Serial must be a number
  737. return &ParseError{"", "bad CSYNC flags", l}
  738. }
  739. rr.Flags = uint16(j)
  740. rr.TypeBitMap = make([]uint16, 0)
  741. var (
  742. k uint16
  743. ok bool
  744. )
  745. l, _ = c.Next()
  746. for l.value != zNewline && l.value != zEOF {
  747. switch l.value {
  748. case zBlank:
  749. // Ok
  750. case zString:
  751. tokenUpper := strings.ToUpper(l.token)
  752. if k, ok = StringToType[tokenUpper]; !ok {
  753. if k, ok = typeToInt(l.token); !ok {
  754. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  755. }
  756. }
  757. rr.TypeBitMap = append(rr.TypeBitMap, k)
  758. default:
  759. return &ParseError{"", "bad CSYNC TypeBitMap", l}
  760. }
  761. l, _ = c.Next()
  762. }
  763. return nil
  764. }
  765. func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError {
  766. l, _ := c.Next()
  767. i, e := strconv.ParseUint(l.token, 10, 32)
  768. if e != nil || l.err {
  769. return &ParseError{"", "bad ZONEMD Serial", l}
  770. }
  771. rr.Serial = uint32(i)
  772. c.Next() // zBlank
  773. l, _ = c.Next()
  774. i, e1 := strconv.ParseUint(l.token, 10, 8)
  775. if e1 != nil || l.err {
  776. return &ParseError{"", "bad ZONEMD Scheme", l}
  777. }
  778. rr.Scheme = uint8(i)
  779. c.Next() // zBlank
  780. l, _ = c.Next()
  781. i, err := strconv.ParseUint(l.token, 10, 8)
  782. if err != nil || l.err {
  783. return &ParseError{"", "bad ZONEMD Hash Algorithm", l}
  784. }
  785. rr.Hash = uint8(i)
  786. s, e2 := endingToString(c, "bad ZONEMD Digest")
  787. if e2 != nil {
  788. return e2
  789. }
  790. rr.Digest = s
  791. return nil
  792. }
  793. func (rr *SIG) parse(c *zlexer, o string) *ParseError { return rr.RRSIG.parse(c, o) }
  794. func (rr *RRSIG) parse(c *zlexer, o string) *ParseError {
  795. l, _ := c.Next()
  796. tokenUpper := strings.ToUpper(l.token)
  797. if t, ok := StringToType[tokenUpper]; !ok {
  798. if strings.HasPrefix(tokenUpper, "TYPE") {
  799. t, ok = typeToInt(l.token)
  800. if !ok {
  801. return &ParseError{"", "bad RRSIG Typecovered", l}
  802. }
  803. rr.TypeCovered = t
  804. } else {
  805. return &ParseError{"", "bad RRSIG Typecovered", l}
  806. }
  807. } else {
  808. rr.TypeCovered = t
  809. }
  810. c.Next() // zBlank
  811. l, _ = c.Next()
  812. if l.err {
  813. return &ParseError{"", "bad RRSIG Algorithm", l}
  814. }
  815. i, e := strconv.ParseUint(l.token, 10, 8)
  816. rr.Algorithm = uint8(i) // if 0 we'll check the mnemonic in the if
  817. if e != nil {
  818. v, ok := StringToAlgorithm[l.token]
  819. if !ok {
  820. return &ParseError{"", "bad RRSIG Algorithm", l}
  821. }
  822. rr.Algorithm = v
  823. }
  824. c.Next() // zBlank
  825. l, _ = c.Next()
  826. i, e1 := strconv.ParseUint(l.token, 10, 8)
  827. if e1 != nil || l.err {
  828. return &ParseError{"", "bad RRSIG Labels", l}
  829. }
  830. rr.Labels = uint8(i)
  831. c.Next() // zBlank
  832. l, _ = c.Next()
  833. i, e2 := strconv.ParseUint(l.token, 10, 32)
  834. if e2 != nil || l.err {
  835. return &ParseError{"", "bad RRSIG OrigTtl", l}
  836. }
  837. rr.OrigTtl = uint32(i)
  838. c.Next() // zBlank
  839. l, _ = c.Next()
  840. if i, err := StringToTime(l.token); err != nil {
  841. // Try to see if all numeric and use it as epoch
  842. if i, err := strconv.ParseUint(l.token, 10, 32); err == nil {
  843. rr.Expiration = uint32(i)
  844. } else {
  845. return &ParseError{"", "bad RRSIG Expiration", l}
  846. }
  847. } else {
  848. rr.Expiration = i
  849. }
  850. c.Next() // zBlank
  851. l, _ = c.Next()
  852. if i, err := StringToTime(l.token); err != nil {
  853. if i, err := strconv.ParseUint(l.token, 10, 32); err == nil {
  854. rr.Inception = uint32(i)
  855. } else {
  856. return &ParseError{"", "bad RRSIG Inception", l}
  857. }
  858. } else {
  859. rr.Inception = i
  860. }
  861. c.Next() // zBlank
  862. l, _ = c.Next()
  863. i, e3 := strconv.ParseUint(l.token, 10, 16)
  864. if e3 != nil || l.err {
  865. return &ParseError{"", "bad RRSIG KeyTag", l}
  866. }
  867. rr.KeyTag = uint16(i)
  868. c.Next() // zBlank
  869. l, _ = c.Next()
  870. rr.SignerName = l.token
  871. name, nameOk := toAbsoluteName(l.token, o)
  872. if l.err || !nameOk {
  873. return &ParseError{"", "bad RRSIG SignerName", l}
  874. }
  875. rr.SignerName = name
  876. s, e4 := endingToString(c, "bad RRSIG Signature")
  877. if e4 != nil {
  878. return e4
  879. }
  880. rr.Signature = s
  881. return nil
  882. }
  883. func (rr *NSEC) parse(c *zlexer, o string) *ParseError {
  884. l, _ := c.Next()
  885. name, nameOk := toAbsoluteName(l.token, o)
  886. if l.err || !nameOk {
  887. return &ParseError{"", "bad NSEC NextDomain", l}
  888. }
  889. rr.NextDomain = name
  890. rr.TypeBitMap = make([]uint16, 0)
  891. var (
  892. k uint16
  893. ok bool
  894. )
  895. l, _ = c.Next()
  896. for l.value != zNewline && l.value != zEOF {
  897. switch l.value {
  898. case zBlank:
  899. // Ok
  900. case zString:
  901. tokenUpper := strings.ToUpper(l.token)
  902. if k, ok = StringToType[tokenUpper]; !ok {
  903. if k, ok = typeToInt(l.token); !ok {
  904. return &ParseError{"", "bad NSEC TypeBitMap", l}
  905. }
  906. }
  907. rr.TypeBitMap = append(rr.TypeBitMap, k)
  908. default:
  909. return &ParseError{"", "bad NSEC TypeBitMap", l}
  910. }
  911. l, _ = c.Next()
  912. }
  913. return nil
  914. }
  915. func (rr *NSEC3) parse(c *zlexer, o string) *ParseError {
  916. l, _ := c.Next()
  917. i, e := strconv.ParseUint(l.token, 10, 8)
  918. if e != nil || l.err {
  919. return &ParseError{"", "bad NSEC3 Hash", l}
  920. }
  921. rr.Hash = uint8(i)
  922. c.Next() // zBlank
  923. l, _ = c.Next()
  924. i, e1 := strconv.ParseUint(l.token, 10, 8)
  925. if e1 != nil || l.err {
  926. return &ParseError{"", "bad NSEC3 Flags", l}
  927. }
  928. rr.Flags = uint8(i)
  929. c.Next() // zBlank
  930. l, _ = c.Next()
  931. i, e2 := strconv.ParseUint(l.token, 10, 16)
  932. if e2 != nil || l.err {
  933. return &ParseError{"", "bad NSEC3 Iterations", l}
  934. }
  935. rr.Iterations = uint16(i)
  936. c.Next()
  937. l, _ = c.Next()
  938. if l.token == "" || l.err {
  939. return &ParseError{"", "bad NSEC3 Salt", l}
  940. }
  941. if l.token != "-" {
  942. rr.SaltLength = uint8(len(l.token)) / 2
  943. rr.Salt = l.token
  944. }
  945. c.Next()
  946. l, _ = c.Next()
  947. if l.token == "" || l.err {
  948. return &ParseError{"", "bad NSEC3 NextDomain", l}
  949. }
  950. rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits)
  951. rr.NextDomain = l.token
  952. rr.TypeBitMap = make([]uint16, 0)
  953. var (
  954. k uint16
  955. ok bool
  956. )
  957. l, _ = c.Next()
  958. for l.value != zNewline && l.value != zEOF {
  959. switch l.value {
  960. case zBlank:
  961. // Ok
  962. case zString:
  963. tokenUpper := strings.ToUpper(l.token)
  964. if k, ok = StringToType[tokenUpper]; !ok {
  965. if k, ok = typeToInt(l.token); !ok {
  966. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  967. }
  968. }
  969. rr.TypeBitMap = append(rr.TypeBitMap, k)
  970. default:
  971. return &ParseError{"", "bad NSEC3 TypeBitMap", l}
  972. }
  973. l, _ = c.Next()
  974. }
  975. return nil
  976. }
  977. func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError {
  978. l, _ := c.Next()
  979. i, e := strconv.ParseUint(l.token, 10, 8)
  980. if e != nil || l.err {
  981. return &ParseError{"", "bad NSEC3PARAM Hash", l}
  982. }
  983. rr.Hash = uint8(i)
  984. c.Next() // zBlank
  985. l, _ = c.Next()
  986. i, e1 := strconv.ParseUint(l.token, 10, 8)
  987. if e1 != nil || l.err {
  988. return &ParseError{"", "bad NSEC3PARAM Flags", l}
  989. }
  990. rr.Flags = uint8(i)
  991. c.Next() // zBlank
  992. l, _ = c.Next()
  993. i, e2 := strconv.ParseUint(l.token, 10, 16)
  994. if e2 != nil || l.err {
  995. return &ParseError{"", "bad NSEC3PARAM Iterations", l}
  996. }
  997. rr.Iterations = uint16(i)
  998. c.Next()
  999. l, _ = c.Next()
  1000. if l.token != "-" {
  1001. rr.SaltLength = uint8(len(l.token) / 2)
  1002. rr.Salt = l.token
  1003. }
  1004. return slurpRemainder(c)
  1005. }
  1006. func (rr *EUI48) parse(c *zlexer, o string) *ParseError {
  1007. l, _ := c.Next()
  1008. if len(l.token) != 17 || l.err {
  1009. return &ParseError{"", "bad EUI48 Address", l}
  1010. }
  1011. addr := make([]byte, 12)
  1012. dash := 0
  1013. for i := 0; i < 10; i += 2 {
  1014. addr[i] = l.token[i+dash]
  1015. addr[i+1] = l.token[i+1+dash]
  1016. dash++
  1017. if l.token[i+1+dash] != '-' {
  1018. return &ParseError{"", "bad EUI48 Address", l}
  1019. }
  1020. }
  1021. addr[10] = l.token[15]
  1022. addr[11] = l.token[16]
  1023. i, e := strconv.ParseUint(string(addr), 16, 48)
  1024. if e != nil {
  1025. return &ParseError{"", "bad EUI48 Address", l}
  1026. }
  1027. rr.Address = i
  1028. return slurpRemainder(c)
  1029. }
  1030. func (rr *EUI64) parse(c *zlexer, o string) *ParseError {
  1031. l, _ := c.Next()
  1032. if len(l.token) != 23 || l.err {
  1033. return &ParseError{"", "bad EUI64 Address", l}
  1034. }
  1035. addr := make([]byte, 16)
  1036. dash := 0
  1037. for i := 0; i < 14; i += 2 {
  1038. addr[i] = l.token[i+dash]
  1039. addr[i+1] = l.token[i+1+dash]
  1040. dash++
  1041. if l.token[i+1+dash] != '-' {
  1042. return &ParseError{"", "bad EUI64 Address", l}
  1043. }
  1044. }
  1045. addr[14] = l.token[21]
  1046. addr[15] = l.token[22]
  1047. i, e := strconv.ParseUint(string(addr), 16, 64)
  1048. if e != nil {
  1049. return &ParseError{"", "bad EUI68 Address", l}
  1050. }
  1051. rr.Address = i
  1052. return slurpRemainder(c)
  1053. }
  1054. func (rr *SSHFP) parse(c *zlexer, o string) *ParseError {
  1055. l, _ := c.Next()
  1056. i, e := strconv.ParseUint(l.token, 10, 8)
  1057. if e != nil || l.err {
  1058. return &ParseError{"", "bad SSHFP Algorithm", l}
  1059. }
  1060. rr.Algorithm = uint8(i)
  1061. c.Next() // zBlank
  1062. l, _ = c.Next()
  1063. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1064. if e1 != nil || l.err {
  1065. return &ParseError{"", "bad SSHFP Type", l}
  1066. }
  1067. rr.Type = uint8(i)
  1068. c.Next() // zBlank
  1069. s, e2 := endingToString(c, "bad SSHFP Fingerprint")
  1070. if e2 != nil {
  1071. return e2
  1072. }
  1073. rr.FingerPrint = s
  1074. return nil
  1075. }
  1076. func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError {
  1077. l, _ := c.Next()
  1078. i, e := strconv.ParseUint(l.token, 10, 16)
  1079. if e != nil || l.err {
  1080. return &ParseError{"", "bad " + typ + " Flags", l}
  1081. }
  1082. rr.Flags = uint16(i)
  1083. c.Next() // zBlank
  1084. l, _ = c.Next() // zString
  1085. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1086. if e1 != nil || l.err {
  1087. return &ParseError{"", "bad " + typ + " Protocol", l}
  1088. }
  1089. rr.Protocol = uint8(i)
  1090. c.Next() // zBlank
  1091. l, _ = c.Next() // zString
  1092. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1093. if e2 != nil || l.err {
  1094. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1095. }
  1096. rr.Algorithm = uint8(i)
  1097. s, e3 := endingToString(c, "bad "+typ+" PublicKey")
  1098. if e3 != nil {
  1099. return e3
  1100. }
  1101. rr.PublicKey = s
  1102. return nil
  1103. }
  1104. func (rr *DNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "DNSKEY") }
  1105. func (rr *KEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "KEY") }
  1106. func (rr *CDNSKEY) parse(c *zlexer, o string) *ParseError { return rr.parseDNSKEY(c, o, "CDNSKEY") }
  1107. func (rr *DS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DS") }
  1108. func (rr *DLV) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "DLV") }
  1109. func (rr *CDS) parse(c *zlexer, o string) *ParseError { return rr.parseDS(c, o, "CDS") }
  1110. func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError {
  1111. l, _ := c.Next()
  1112. num, err := strconv.ParseUint(l.token, 10, 8)
  1113. if err != nil || l.err {
  1114. return &ParseError{"", "bad IPSECKEY value", l}
  1115. }
  1116. rr.Precedence = uint8(num)
  1117. c.Next() // zBlank
  1118. l, _ = c.Next()
  1119. num, err = strconv.ParseUint(l.token, 10, 8)
  1120. if err != nil || l.err {
  1121. return &ParseError{"", "bad IPSECKEY value", l}
  1122. }
  1123. rr.GatewayType = uint8(num)
  1124. c.Next() // zBlank
  1125. l, _ = c.Next()
  1126. num, err = strconv.ParseUint(l.token, 10, 8)
  1127. if err != nil || l.err {
  1128. return &ParseError{"", "bad IPSECKEY value", l}
  1129. }
  1130. rr.Algorithm = uint8(num)
  1131. c.Next() // zBlank
  1132. l, _ = c.Next()
  1133. if l.err {
  1134. return &ParseError{"", "bad IPSECKEY gateway", l}
  1135. }
  1136. rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType)
  1137. if err != nil {
  1138. return &ParseError{"", "IPSECKEY " + err.Error(), l}
  1139. }
  1140. c.Next() // zBlank
  1141. s, pErr := endingToString(c, "bad IPSECKEY PublicKey")
  1142. if pErr != nil {
  1143. return pErr
  1144. }
  1145. rr.PublicKey = s
  1146. return slurpRemainder(c)
  1147. }
  1148. func (rr *AMTRELAY) parse(c *zlexer, o string) *ParseError {
  1149. l, _ := c.Next()
  1150. num, err := strconv.ParseUint(l.token, 10, 8)
  1151. if err != nil || l.err {
  1152. return &ParseError{"", "bad AMTRELAY value", l}
  1153. }
  1154. rr.Precedence = uint8(num)
  1155. c.Next() // zBlank
  1156. l, _ = c.Next()
  1157. if l.err || !(l.token == "0" || l.token == "1") {
  1158. return &ParseError{"", "bad discovery value", l}
  1159. }
  1160. if l.token == "1" {
  1161. rr.GatewayType = 0x80
  1162. }
  1163. c.Next() // zBlank
  1164. l, _ = c.Next()
  1165. num, err = strconv.ParseUint(l.token, 10, 8)
  1166. if err != nil || l.err {
  1167. return &ParseError{"", "bad AMTRELAY value", l}
  1168. }
  1169. rr.GatewayType |= uint8(num)
  1170. c.Next() // zBlank
  1171. l, _ = c.Next()
  1172. if l.err {
  1173. return &ParseError{"", "bad AMTRELAY gateway", l}
  1174. }
  1175. rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType&0x7f)
  1176. if err != nil {
  1177. return &ParseError{"", "AMTRELAY " + err.Error(), l}
  1178. }
  1179. return slurpRemainder(c)
  1180. }
  1181. // same constants and parsing between IPSECKEY and AMTRELAY
  1182. func parseAddrHostUnion(token, o string, gatewayType uint8) (addr net.IP, host string, err error) {
  1183. switch gatewayType {
  1184. case IPSECGatewayNone:
  1185. if token != "." {
  1186. return addr, host, errors.New("gateway type none with gateway set")
  1187. }
  1188. case IPSECGatewayIPv4, IPSECGatewayIPv6:
  1189. addr = net.ParseIP(token)
  1190. if addr == nil {
  1191. return addr, host, errors.New("gateway IP invalid")
  1192. }
  1193. if (addr.To4() == nil) == (gatewayType == IPSECGatewayIPv4) {
  1194. return addr, host, errors.New("gateway IP family mismatch")
  1195. }
  1196. case IPSECGatewayHost:
  1197. var ok bool
  1198. host, ok = toAbsoluteName(token, o)
  1199. if !ok {
  1200. return addr, host, errors.New("invalid gateway host")
  1201. }
  1202. }
  1203. return addr, host, nil
  1204. }
  1205. func (rr *RKEY) parse(c *zlexer, o string) *ParseError {
  1206. l, _ := c.Next()
  1207. i, e := strconv.ParseUint(l.token, 10, 16)
  1208. if e != nil || l.err {
  1209. return &ParseError{"", "bad RKEY Flags", l}
  1210. }
  1211. rr.Flags = uint16(i)
  1212. c.Next() // zBlank
  1213. l, _ = c.Next() // zString
  1214. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1215. if e1 != nil || l.err {
  1216. return &ParseError{"", "bad RKEY Protocol", l}
  1217. }
  1218. rr.Protocol = uint8(i)
  1219. c.Next() // zBlank
  1220. l, _ = c.Next() // zString
  1221. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1222. if e2 != nil || l.err {
  1223. return &ParseError{"", "bad RKEY Algorithm", l}
  1224. }
  1225. rr.Algorithm = uint8(i)
  1226. s, e3 := endingToString(c, "bad RKEY PublicKey")
  1227. if e3 != nil {
  1228. return e3
  1229. }
  1230. rr.PublicKey = s
  1231. return nil
  1232. }
  1233. func (rr *EID) parse(c *zlexer, o string) *ParseError {
  1234. s, e := endingToString(c, "bad EID Endpoint")
  1235. if e != nil {
  1236. return e
  1237. }
  1238. rr.Endpoint = s
  1239. return nil
  1240. }
  1241. func (rr *NIMLOC) parse(c *zlexer, o string) *ParseError {
  1242. s, e := endingToString(c, "bad NIMLOC Locator")
  1243. if e != nil {
  1244. return e
  1245. }
  1246. rr.Locator = s
  1247. return nil
  1248. }
  1249. func (rr *GPOS) parse(c *zlexer, o string) *ParseError {
  1250. l, _ := c.Next()
  1251. _, e := strconv.ParseFloat(l.token, 64)
  1252. if e != nil || l.err {
  1253. return &ParseError{"", "bad GPOS Longitude", l}
  1254. }
  1255. rr.Longitude = l.token
  1256. c.Next() // zBlank
  1257. l, _ = c.Next()
  1258. _, e1 := strconv.ParseFloat(l.token, 64)
  1259. if e1 != nil || l.err {
  1260. return &ParseError{"", "bad GPOS Latitude", l}
  1261. }
  1262. rr.Latitude = l.token
  1263. c.Next() // zBlank
  1264. l, _ = c.Next()
  1265. _, e2 := strconv.ParseFloat(l.token, 64)
  1266. if e2 != nil || l.err {
  1267. return &ParseError{"", "bad GPOS Altitude", l}
  1268. }
  1269. rr.Altitude = l.token
  1270. return slurpRemainder(c)
  1271. }
  1272. func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError {
  1273. l, _ := c.Next()
  1274. i, e := strconv.ParseUint(l.token, 10, 16)
  1275. if e != nil || l.err {
  1276. return &ParseError{"", "bad " + typ + " KeyTag", l}
  1277. }
  1278. rr.KeyTag = uint16(i)
  1279. c.Next() // zBlank
  1280. l, _ = c.Next()
  1281. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1282. tokenUpper := strings.ToUpper(l.token)
  1283. i, ok := StringToAlgorithm[tokenUpper]
  1284. if !ok || l.err {
  1285. return &ParseError{"", "bad " + typ + " Algorithm", l}
  1286. }
  1287. rr.Algorithm = i
  1288. } else {
  1289. rr.Algorithm = uint8(i)
  1290. }
  1291. c.Next() // zBlank
  1292. l, _ = c.Next()
  1293. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1294. if e1 != nil || l.err {
  1295. return &ParseError{"", "bad " + typ + " DigestType", l}
  1296. }
  1297. rr.DigestType = uint8(i)
  1298. s, e2 := endingToString(c, "bad "+typ+" Digest")
  1299. if e2 != nil {
  1300. return e2
  1301. }
  1302. rr.Digest = s
  1303. return nil
  1304. }
  1305. func (rr *TA) parse(c *zlexer, o string) *ParseError {
  1306. l, _ := c.Next()
  1307. i, e := strconv.ParseUint(l.token, 10, 16)
  1308. if e != nil || l.err {
  1309. return &ParseError{"", "bad TA KeyTag", l}
  1310. }
  1311. rr.KeyTag = uint16(i)
  1312. c.Next() // zBlank
  1313. l, _ = c.Next()
  1314. if i, err := strconv.ParseUint(l.token, 10, 8); err != nil {
  1315. tokenUpper := strings.ToUpper(l.token)
  1316. i, ok := StringToAlgorithm[tokenUpper]
  1317. if !ok || l.err {
  1318. return &ParseError{"", "bad TA Algorithm", l}
  1319. }
  1320. rr.Algorithm = i
  1321. } else {
  1322. rr.Algorithm = uint8(i)
  1323. }
  1324. c.Next() // zBlank
  1325. l, _ = c.Next()
  1326. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1327. if e1 != nil || l.err {
  1328. return &ParseError{"", "bad TA DigestType", l}
  1329. }
  1330. rr.DigestType = uint8(i)
  1331. s, e2 := endingToString(c, "bad TA Digest")
  1332. if e2 != nil {
  1333. return e2
  1334. }
  1335. rr.Digest = s
  1336. return nil
  1337. }
  1338. func (rr *TLSA) parse(c *zlexer, o string) *ParseError {
  1339. l, _ := c.Next()
  1340. i, e := strconv.ParseUint(l.token, 10, 8)
  1341. if e != nil || l.err {
  1342. return &ParseError{"", "bad TLSA Usage", l}
  1343. }
  1344. rr.Usage = uint8(i)
  1345. c.Next() // zBlank
  1346. l, _ = c.Next()
  1347. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1348. if e1 != nil || l.err {
  1349. return &ParseError{"", "bad TLSA Selector", l}
  1350. }
  1351. rr.Selector = uint8(i)
  1352. c.Next() // zBlank
  1353. l, _ = c.Next()
  1354. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1355. if e2 != nil || l.err {
  1356. return &ParseError{"", "bad TLSA MatchingType", l}
  1357. }
  1358. rr.MatchingType = uint8(i)
  1359. // So this needs be e2 (i.e. different than e), because...??t
  1360. s, e3 := endingToString(c, "bad TLSA Certificate")
  1361. if e3 != nil {
  1362. return e3
  1363. }
  1364. rr.Certificate = s
  1365. return nil
  1366. }
  1367. func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError {
  1368. l, _ := c.Next()
  1369. i, e := strconv.ParseUint(l.token, 10, 8)
  1370. if e != nil || l.err {
  1371. return &ParseError{"", "bad SMIMEA Usage", l}
  1372. }
  1373. rr.Usage = uint8(i)
  1374. c.Next() // zBlank
  1375. l, _ = c.Next()
  1376. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1377. if e1 != nil || l.err {
  1378. return &ParseError{"", "bad SMIMEA Selector", l}
  1379. }
  1380. rr.Selector = uint8(i)
  1381. c.Next() // zBlank
  1382. l, _ = c.Next()
  1383. i, e2 := strconv.ParseUint(l.token, 10, 8)
  1384. if e2 != nil || l.err {
  1385. return &ParseError{"", "bad SMIMEA MatchingType", l}
  1386. }
  1387. rr.MatchingType = uint8(i)
  1388. // So this needs be e2 (i.e. different than e), because...??t
  1389. s, e3 := endingToString(c, "bad SMIMEA Certificate")
  1390. if e3 != nil {
  1391. return e3
  1392. }
  1393. rr.Certificate = s
  1394. return nil
  1395. }
  1396. func (rr *RFC3597) parse(c *zlexer, o string) *ParseError {
  1397. l, _ := c.Next()
  1398. if l.token != "\\#" {
  1399. return &ParseError{"", "bad RFC3597 Rdata", l}
  1400. }
  1401. c.Next() // zBlank
  1402. l, _ = c.Next()
  1403. rdlength, e := strconv.ParseUint(l.token, 10, 16)
  1404. if e != nil || l.err {
  1405. return &ParseError{"", "bad RFC3597 Rdata ", l}
  1406. }
  1407. s, e1 := endingToString(c, "bad RFC3597 Rdata")
  1408. if e1 != nil {
  1409. return e1
  1410. }
  1411. if int(rdlength)*2 != len(s) {
  1412. return &ParseError{"", "bad RFC3597 Rdata", l}
  1413. }
  1414. rr.Rdata = s
  1415. return nil
  1416. }
  1417. func (rr *SPF) parse(c *zlexer, o string) *ParseError {
  1418. s, e := endingToTxtSlice(c, "bad SPF Txt")
  1419. if e != nil {
  1420. return e
  1421. }
  1422. rr.Txt = s
  1423. return nil
  1424. }
  1425. func (rr *AVC) parse(c *zlexer, o string) *ParseError {
  1426. s, e := endingToTxtSlice(c, "bad AVC Txt")
  1427. if e != nil {
  1428. return e
  1429. }
  1430. rr.Txt = s
  1431. return nil
  1432. }
  1433. func (rr *TXT) parse(c *zlexer, o string) *ParseError {
  1434. // no zBlank reading here, because all this rdata is TXT
  1435. s, e := endingToTxtSlice(c, "bad TXT Txt")
  1436. if e != nil {
  1437. return e
  1438. }
  1439. rr.Txt = s
  1440. return nil
  1441. }
  1442. // identical to setTXT
  1443. func (rr *NINFO) parse(c *zlexer, o string) *ParseError {
  1444. s, e := endingToTxtSlice(c, "bad NINFO ZSData")
  1445. if e != nil {
  1446. return e
  1447. }
  1448. rr.ZSData = s
  1449. return nil
  1450. }
  1451. func (rr *URI) parse(c *zlexer, o string) *ParseError {
  1452. l, _ := c.Next()
  1453. i, e := strconv.ParseUint(l.token, 10, 16)
  1454. if e != nil || l.err {
  1455. return &ParseError{"", "bad URI Priority", l}
  1456. }
  1457. rr.Priority = uint16(i)
  1458. c.Next() // zBlank
  1459. l, _ = c.Next()
  1460. i, e1 := strconv.ParseUint(l.token, 10, 16)
  1461. if e1 != nil || l.err {
  1462. return &ParseError{"", "bad URI Weight", l}
  1463. }
  1464. rr.Weight = uint16(i)
  1465. c.Next() // zBlank
  1466. s, e2 := endingToTxtSlice(c, "bad URI Target")
  1467. if e2 != nil {
  1468. return e2
  1469. }
  1470. if len(s) != 1 {
  1471. return &ParseError{"", "bad URI Target", l}
  1472. }
  1473. rr.Target = s[0]
  1474. return nil
  1475. }
  1476. func (rr *DHCID) parse(c *zlexer, o string) *ParseError {
  1477. // awesome record to parse!
  1478. s, e := endingToString(c, "bad DHCID Digest")
  1479. if e != nil {
  1480. return e
  1481. }
  1482. rr.Digest = s
  1483. return nil
  1484. }
  1485. func (rr *NID) parse(c *zlexer, o string) *ParseError {
  1486. l, _ := c.Next()
  1487. i, e := strconv.ParseUint(l.token, 10, 16)
  1488. if e != nil || l.err {
  1489. return &ParseError{"", "bad NID Preference", l}
  1490. }
  1491. rr.Preference = uint16(i)
  1492. c.Next() // zBlank
  1493. l, _ = c.Next() // zString
  1494. u, e1 := stringToNodeID(l)
  1495. if e1 != nil || l.err {
  1496. return e1
  1497. }
  1498. rr.NodeID = u
  1499. return slurpRemainder(c)
  1500. }
  1501. func (rr *L32) parse(c *zlexer, o string) *ParseError {
  1502. l, _ := c.Next()
  1503. i, e := strconv.ParseUint(l.token, 10, 16)
  1504. if e != nil || l.err {
  1505. return &ParseError{"", "bad L32 Preference", l}
  1506. }
  1507. rr.Preference = uint16(i)
  1508. c.Next() // zBlank
  1509. l, _ = c.Next() // zString
  1510. rr.Locator32 = net.ParseIP(l.token)
  1511. if rr.Locator32 == nil || l.err {
  1512. return &ParseError{"", "bad L32 Locator", l}
  1513. }
  1514. return slurpRemainder(c)
  1515. }
  1516. func (rr *LP) parse(c *zlexer, o string) *ParseError {
  1517. l, _ := c.Next()
  1518. i, e := strconv.ParseUint(l.token, 10, 16)
  1519. if e != nil || l.err {
  1520. return &ParseError{"", "bad LP Preference", l}
  1521. }
  1522. rr.Preference = uint16(i)
  1523. c.Next() // zBlank
  1524. l, _ = c.Next() // zString
  1525. rr.Fqdn = l.token
  1526. name, nameOk := toAbsoluteName(l.token, o)
  1527. if l.err || !nameOk {
  1528. return &ParseError{"", "bad LP Fqdn", l}
  1529. }
  1530. rr.Fqdn = name
  1531. return slurpRemainder(c)
  1532. }
  1533. func (rr *L64) parse(c *zlexer, o string) *ParseError {
  1534. l, _ := c.Next()
  1535. i, e := strconv.ParseUint(l.token, 10, 16)
  1536. if e != nil || l.err {
  1537. return &ParseError{"", "bad L64 Preference", l}
  1538. }
  1539. rr.Preference = uint16(i)
  1540. c.Next() // zBlank
  1541. l, _ = c.Next() // zString
  1542. u, e1 := stringToNodeID(l)
  1543. if e1 != nil || l.err {
  1544. return e1
  1545. }
  1546. rr.Locator64 = u
  1547. return slurpRemainder(c)
  1548. }
  1549. func (rr *UID) parse(c *zlexer, o string) *ParseError {
  1550. l, _ := c.Next()
  1551. i, e := strconv.ParseUint(l.token, 10, 32)
  1552. if e != nil || l.err {
  1553. return &ParseError{"", "bad UID Uid", l}
  1554. }
  1555. rr.Uid = uint32(i)
  1556. return slurpRemainder(c)
  1557. }
  1558. func (rr *GID) parse(c *zlexer, o string) *ParseError {
  1559. l, _ := c.Next()
  1560. i, e := strconv.ParseUint(l.token, 10, 32)
  1561. if e != nil || l.err {
  1562. return &ParseError{"", "bad GID Gid", l}
  1563. }
  1564. rr.Gid = uint32(i)
  1565. return slurpRemainder(c)
  1566. }
  1567. func (rr *UINFO) parse(c *zlexer, o string) *ParseError {
  1568. s, e := endingToTxtSlice(c, "bad UINFO Uinfo")
  1569. if e != nil {
  1570. return e
  1571. }
  1572. if ln := len(s); ln == 0 {
  1573. return nil
  1574. }
  1575. rr.Uinfo = s[0] // silently discard anything after the first character-string
  1576. return nil
  1577. }
  1578. func (rr *PX) parse(c *zlexer, o string) *ParseError {
  1579. l, _ := c.Next()
  1580. i, e := strconv.ParseUint(l.token, 10, 16)
  1581. if e != nil || l.err {
  1582. return &ParseError{"", "bad PX Preference", l}
  1583. }
  1584. rr.Preference = uint16(i)
  1585. c.Next() // zBlank
  1586. l, _ = c.Next() // zString
  1587. rr.Map822 = l.token
  1588. map822, map822Ok := toAbsoluteName(l.token, o)
  1589. if l.err || !map822Ok {
  1590. return &ParseError{"", "bad PX Map822", l}
  1591. }
  1592. rr.Map822 = map822
  1593. c.Next() // zBlank
  1594. l, _ = c.Next() // zString
  1595. rr.Mapx400 = l.token
  1596. mapx400, mapx400Ok := toAbsoluteName(l.token, o)
  1597. if l.err || !mapx400Ok {
  1598. return &ParseError{"", "bad PX Mapx400", l}
  1599. }
  1600. rr.Mapx400 = mapx400
  1601. return slurpRemainder(c)
  1602. }
  1603. func (rr *CAA) parse(c *zlexer, o string) *ParseError {
  1604. l, _ := c.Next()
  1605. i, e := strconv.ParseUint(l.token, 10, 8)
  1606. if e != nil || l.err {
  1607. return &ParseError{"", "bad CAA Flag", l}
  1608. }
  1609. rr.Flag = uint8(i)
  1610. c.Next() // zBlank
  1611. l, _ = c.Next() // zString
  1612. if l.value != zString {
  1613. return &ParseError{"", "bad CAA Tag", l}
  1614. }
  1615. rr.Tag = l.token
  1616. c.Next() // zBlank
  1617. s, e1 := endingToTxtSlice(c, "bad CAA Value")
  1618. if e1 != nil {
  1619. return e1
  1620. }
  1621. if len(s) != 1 {
  1622. return &ParseError{"", "bad CAA Value", l}
  1623. }
  1624. rr.Value = s[0]
  1625. return nil
  1626. }
  1627. func (rr *TKEY) parse(c *zlexer, o string) *ParseError {
  1628. l, _ := c.Next()
  1629. // Algorithm
  1630. if l.value != zString {
  1631. return &ParseError{"", "bad TKEY algorithm", l}
  1632. }
  1633. rr.Algorithm = l.token
  1634. c.Next() // zBlank
  1635. // Get the key length and key values
  1636. l, _ = c.Next()
  1637. i, e := strconv.ParseUint(l.token, 10, 8)
  1638. if e != nil || l.err {
  1639. return &ParseError{"", "bad TKEY key length", l}
  1640. }
  1641. rr.KeySize = uint16(i)
  1642. c.Next() // zBlank
  1643. l, _ = c.Next()
  1644. if l.value != zString {
  1645. return &ParseError{"", "bad TKEY key", l}
  1646. }
  1647. rr.Key = l.token
  1648. c.Next() // zBlank
  1649. // Get the otherdata length and string data
  1650. l, _ = c.Next()
  1651. i, e1 := strconv.ParseUint(l.token, 10, 8)
  1652. if e1 != nil || l.err {
  1653. return &ParseError{"", "bad TKEY otherdata length", l}
  1654. }
  1655. rr.OtherLen = uint16(i)
  1656. c.Next() // zBlank
  1657. l, _ = c.Next()
  1658. if l.value != zString {
  1659. return &ParseError{"", "bad TKEY otherday", l}
  1660. }
  1661. rr.OtherData = l.token
  1662. return nil
  1663. }
  1664. func (rr *APL) parse(c *zlexer, o string) *ParseError {
  1665. var prefixes []APLPrefix
  1666. for {
  1667. l, _ := c.Next()
  1668. if l.value == zNewline || l.value == zEOF {
  1669. break
  1670. }
  1671. if l.value == zBlank && prefixes != nil {
  1672. continue
  1673. }
  1674. if l.value != zString {
  1675. return &ParseError{"", "unexpected APL field", l}
  1676. }
  1677. // Expected format: [!]afi:address/prefix
  1678. colon := strings.IndexByte(l.token, ':')
  1679. if colon == -1 {
  1680. return &ParseError{"", "missing colon in APL field", l}
  1681. }
  1682. family, cidr := l.token[:colon], l.token[colon+1:]
  1683. var negation bool
  1684. if family != "" && family[0] == '!' {
  1685. negation = true
  1686. family = family[1:]
  1687. }
  1688. afi, e := strconv.ParseUint(family, 10, 16)
  1689. if e != nil {
  1690. return &ParseError{"", "failed to parse APL family: " + e.Error(), l}
  1691. }
  1692. var addrLen int
  1693. switch afi {
  1694. case 1:
  1695. addrLen = net.IPv4len
  1696. case 2:
  1697. addrLen = net.IPv6len
  1698. default:
  1699. return &ParseError{"", "unrecognized APL family", l}
  1700. }
  1701. ip, subnet, e1 := net.ParseCIDR(cidr)
  1702. if e1 != nil {
  1703. return &ParseError{"", "failed to parse APL address: " + e1.Error(), l}
  1704. }
  1705. if !ip.Equal(subnet.IP) {
  1706. return &ParseError{"", "extra bits in APL address", l}
  1707. }
  1708. if len(subnet.IP) != addrLen {
  1709. return &ParseError{"", "address mismatch with the APL family", l}
  1710. }
  1711. prefixes = append(prefixes, APLPrefix{
  1712. Negation: negation,
  1713. Network: *subnet,
  1714. })
  1715. }
  1716. rr.Prefixes = prefixes
  1717. return nil
  1718. }