php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #47035 dns_get_record returns a garbage byte at the end of a TXT record
Submitted: 2009-01-08 09:07 UTC Modified: 2009-01-15 12:44 UTC
Votes:1
Avg. Score:4.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: valli at icsurselva dot ch Assigned: felipe (profile)
Status: Closed Package: Network related
PHP Version: 5.2.8 OS: gentoo
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: valli at icsurselva dot ch
New email:
PHP Version: OS:

 

 [2009-01-08 09:07 UTC] valli at icsurselva dot ch
Description:
------------
The last byte of a TXT record returned by dns_get_record
is garbage.


Reproduce code:
---------------
$rt = dns_get_record('82.19.186.195.countries.blackholes.us', DNS_TXT);
$txt = $rt[0]['txt'];
print $txt." (".strlen($txt).")\n";
foreach(str_split($txt) as $char) {
    print "$char\t".ord($char)."\n";
}


Expected result:
----------------
ch (2)
c       99
h       104


Actual result:
--------------
ch (3)
c       99
h       104
        128


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-01-08 09:31 UTC] valli at icsurselva dot ch
Here's my current workaround:

$rt = @dns_get_record($lookuphost, DNS_ANY);
// workaround for http://bugs.php.net/bug.php?id=47035
if (substr(PHP_VERSION,0,strpos(PHP_VERSION, '-')) == '5.2.8') {
    for($i = 0, $rts = sizeof($rt); $i < $rts; ++$i) {
        if ($rt[$i]['type'] == 'TXT') {
            // remove last byte
            $rt[$i]['txt'] = substr($rt[$i]['txt'], 0, -1);
        }
    }
}
 [2009-01-08 17:20 UTC] felipe@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.

Thanks.
 [2009-01-09 11:36 UTC] valli at icsurselva dot ch
Hello again,
I just dicovered that the garbage chars not
only appear at the end of a TXT record.
Example:
 nslookup -type=TXT 82.19.186.195.aspath.routeviews.org
 Returns: text = "13237 3303 44038" "195.186.0.0" "17"

This DNS request returns 3 Strings.
If I do this with dns_get_record the strings are concatenated
(containing a garbage char between the strings)

BTW: Is it really a good idea to concatenate this strings?
     Wouldn't it better to return a array containing this strings?
     Example: the anwers from routeviews.org are really
              hard (if not impossible) to parse in this way:
              "13237 3303 44038195.186.0.017"
              it would be better in this way:
              array("13237 3303 44038","195.186.0.0","17")
 [2009-01-09 12:52 UTC] pajoye@php.net
I agree, it would be more logical to return an array of strings.

Comments?
 [2009-01-12 20:40 UTC] felipe@php.net
Sure, it's right to do.

We add a new entry in the array returned, on 5.3+ we get:

array(6) {
  ["host"]=>
  string(35) "82.19.186.195.aspath.routeviews.org"
  ["type"]=>
  string(3) "TXT"
  ["txt"]=>
  string(31) "13237 3303 44038195.186.0.017"
  ["entries"]=>
  array(3) {
    [0]=>
    string(16) "13237 3303 44038"
    [1]=>
    string(11) "195.186.0.0"
    [2]=>
    string(2) "17"
  }
  ["class"]=>
  string(2) "IN"
  ["ttl"]=>
  int(592)
}

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Nov 23 09:01:28 2024 UTC