From: Sam Roberts Date: 2005-02-05T12:21:09+09:00 Subject: bug - resolv.rb dies on TXT records with multiple strings The attached patch fixes this. Note well that it does it in such a way that it is backwards compatible, but also allows callers to see the strings as an array. I need this. RFC1035 says "semantics of the text depends on the domain where it is found", and the DNS-SD draft says mDNS TXT responses contain key/value pairs, where each key/value pair is a from the TXT rdata. RFC1035: 3.3.14. TXT RDATA format +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / TXT-DATA / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ where: TXT-DATA One or more s. TXT RRs are used to hold descriptive text. The semantics of the text depends on the domain where it is found. Reproduce this with packet collected from wild: require 'resolv.rb' require 'pp' data = "\000\000\000\000\000\003\000\003\000\000\000\000\025Sam Roberts\342\200\231s Music\005_daap\004_tcp\005local\000\000!\000\001\300\f\000\020\000\001\300\"\000\f\000\001\300\f\000!\000\001\000\000\000;\000\021\000\000\000\000\016i\010ensemble\300-\300\f\000\020\000\001\000\000\000;\000\224\ttxtvers=1\016Version=196608\023iTSh Version=131073\027Machine ID=9C5AC2725708\034Database ID=681233690CC1C418\"Machine Name=Sam Roberts\342\200\231s Music\016Password=false\300\"\000\f\000\001\000\000\034\037\000\002\300\f" msg = Resolv::DNS::Message.decode(data) pp msg txtanswer = msg.answer[1] txtrr = txtanswer[2] pp txtrr.data pp txtrr.datas Changelog: resolv.rb dies on TXT records with multiple strings Patch: Index: resolv.rb =================================================================== RCS file: /src/ruby/lib/resolv.rb,v retrieving revision 1.17.2.8 diff -u -r1.17.2.8 resolv.rb --- resolv.rb 29 Jan 2005 05:22:35 -0000 1.17.2.8 +++ resolv.rb 5 Feb 2005 03:11:52 -0000 @@ -1266,6 +1266,14 @@ return d end + def get_strings + strings = [] + until @index == @limit + strings << get_string + end + strings + end + def get_name return Name.new(self.get_labels) end @@ -1511,14 +1519,21 @@ def initialize(data) @data = data end - attr_reader :data + + def data + @data.join + end + + def datas + @data + end def encode_rdata(msg) msg.put_string(@data) end def self.decode_rdata(msg) - data = msg.get_string + data = msg.get_strings return self.new(data) end end