From: James Gray Date: 2008-04-30T20:25:25+09:00 Subject: Re: Repeatable bug in Net::Telnet EOL translation On Apr 30, 2008, at 5:27 AM, Brian Candler wrote: >> I've created a patch against trunk that I believe adds this check and >> attached it to this message. Could you please confirm that this >> patch >> resolves the regex matching issue you are seeing? >> >> If anyone sees any problems with this fix, please feel free to point >> them out. > > Thank you for your quick response. In my test rig, your patch makes > the > problem go away for operation with 'Telnetmode'=>true (the default). > > However the problem is still there if you set 'Telnetmode'=>false in > the > client. This is because there's a separate piece of code for this > case: > > # Not Telnetmode. > # > # We cannot use preprocess() on this data, because that > # method makes some Telnetmode-specific assumptions. > buf = c > buf.gsub!(/#{EOL}/no, "\n") unless @options["Binmode"] > rest = '' Good catch. > So similar logic is needed to split the string if it ends with \r. The > following seems to work - does it look OK to you? > > --- telnet.rb.orig 2008-04-30 11:14:57.000000000 +0100 > +++ telnet.rb 2008-04-30 11:22:01.000000000 +0100 > @@ -570,14 +570,20 @@ > buf = preprocess(c) > rest = '' > end > - else > + else > # Not Telnetmode. > # > # We cannot use preprocess() on this data, because that > # method makes some Telnetmode-specific assumptions. > - buf = c > - buf.gsub!(/#{EOL}/no, "\n") unless @options["Binmode"] > + buf = rest + c > rest = '' > + unless @options["Binmode"] > + if pt = buf.rindex(/\r\z/no) > + buf = buf[0 ... pt] > + rest = buf[pt .. -1] > + end > + buf.gsub!(/#{EOL}/no, "\n") > + end > end > @log.print(buf) if @options.has_key?("Output_log") > line += buf Works for me. I've committed our combined patch to trunk and the Ruby 1.8 branch. Should be all fixed up now. James Edward Gray II