in reply to Net::DNS::RR patch

Why not just change the regexp to
$rrstring =~ s/^((?:[^\n;]+|"(?:[^\n"\\]|\\[^\n])*")*);[^\n]*$/$1/mg;
What you presented only helps TXT records (even though it's not the only one that can have strings), and doesn't allow embeded quotes ("dd\"dd") even though the spec does.

Replies are listed 'Best First'.
Re^2: Net::DNS::RR patch
by slife (Scribe) on Dec 16, 2004 at 10:23 UTC

    I accept your point about only applying the test to TXT records, and have modified the proposed patch accordingly.

    However, your regex doesn't work for the observed bug. Using the code from twilde's original bug report:

    Your regex:

    my $rr = Net::DNS::RR->new_from_string( 'badtxt.krellis.us. 1234 TXT "something ;something else"' ); print '"', $rr->rr_rdata, '"', "\n";

    Gives:

    ""

    My patch gives:

    "something ;something else"

    I also disagree with you assertion that the patch won't allow backslashed quotes within TXT RDATA. e.g.:

    my $rr = Net::DNS::RR->new_from_string( 'badtxt.krellis.us. 1234 TXT "something \" ; \" something else"' ); print '"', $rr->rr_rdata, '"', "\n";

    Gives:

    "something " ; " something else"
      However, your regex doesn't work

      You're right here. I deleted a " by accident. Here's the fix:

      $rrstring =~ s/^((?:[^\n";]+|"(?:[^\n"\\]|\\[^\n])*")*);[^\n]*$/$1/mg; ^ was missing
      I also disagree with you assertion that the patch won't allow backslashed quotes within TXT RDATA.

      It completely ignores backslashes, so I knew there was a problem. I was only wrong in how it fails. Your patch does allow backslashes, but it incorrectly finds the end of the quoted string.

      Here's a string where it fails to work:

      # Here's the simplest case where it fails: # $expect = "\"Joe\""; # $rdata = $expect . " ; \"comment\""; $expect = "\"John \\\"The Wiz\\\" Doe; programmer\""; $rdata = $expect . " ; \"comment\""; print("Input: ", $rdata, $/); print("Expect: ", $expect, $/); if(($rdata)=~m[;]) { if(($rdata)=~m[^(".*")($|\s*;)]) { $rdata = $1; } else { ($rdata)=~s/;.*//g; } } print("Get: ", $rdata, $/); __END__ output ====== Input: "John \"The Wiz\" Doe; programmer" ; "comment" Expect: "John \"The Wiz\" Doe; programmer" Get: "John \"The Wiz\" Doe; programmer" ; "comment"

      btw, the /g in ($rdata)=~s/;.*//g; is not necessary.