Skip to content

Commit

Permalink
Fix uninitialized string offset in rcube_utils::bin2ascii() and make …
Browse files Browse the repository at this point in the history
…sure rcube_utils::random_bytes() result has always requested length (#5788)
  • Loading branch information
alecpl committed Jun 27, 2017
1 parent 3d498cd commit 183f68f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 43 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ CHANGELOG Roundcube Webmail
- Fix addressbook searching by gender (#5757)
- Fix SQL syntax error on MariaDB 10.2 (#5774)
- Fix bug where it wasn't possible to set timezone to auto-detected value (#5782)
- Fix uninitialized string offset in rcube_utils::bin2ascii() and make sure rcube_utils::random_bytes() result has always requested length (#5788)

RELEASE 1.2.5
-------------
Expand Down
67 changes: 24 additions & 43 deletions program/lib/Roundcube/rcube_utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -1161,28 +1161,33 @@ public static function resolve_url($url)
*/
public static function random_bytes($length, $raw = false)
{
$hextab = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$tabsize = strlen($hextab);

// Use PHP7 true random generator
if (function_exists('random_bytes')) {
// random_bytes() can throw an Error/TypeError/Exception in some cases
try {
$random = random_bytes($length);
}
catch (Throwable $e) {}
if ($raw && function_exists('random_bytes')) {
return random_bytes($length);
}

if (!$random) {
$random = openssl_random_pseudo_bytes($length);
}
if (!$raw && function_exists('random_int')) {
$result = '';
while ($length-- > 0) {
$result .= $hextab[random_int(0, $tabsize - 1)];
}

if ($raw) {
return $random;
return $result;
}

$random = self::bin2ascii($random);
$random = openssl_random_pseudo_bytes($length);

if ($random === false) {
throw new Exception("Failed to get random bytes");
}

// truncate to the specified size...
if ($length < strlen($random)) {
$random = substr($random, 0, $length);
if (!$raw) {
for ($x = 0; $x < $length; $x++) {
$random[$x] = $hextab[ord($random[$x]) % $tabsize];
}
}

return $random;
Expand All @@ -1193,40 +1198,16 @@ public static function random_bytes($length, $raw = false)
*
* @param string $input Binary input
*
* @return string Readable output
* @return string Readable output (Base62)
* @deprecated since 1.3.1
*/
public static function bin2ascii($input)
{
// Above method returns "hexits".
// Based on bin_to_readable() function in ext/session/session.c.
// Note: removed ",-" characters from hextab
$hextab = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$nbits = 6; // can be 4, 5 or 6
$length = strlen($input);
$result = '';
$char = 0;
$i = 0;
$have = 0;
$mask = (1 << $nbits) - 1;

while (true) {
if ($have < $nbits) {
if ($i < $length) {
$char |= ord($input[$i++]) << $have;
$have += 8;
}
else if (!$have) {
break;
}
else {
$have = $nbits;
}
}

// consume nbits
$result .= $hextab[$char & $mask];
$char >>= $nbits;
$have -= $nbits;
for ($x = 0; $x < strlen($input); $x++) {
$result .= $hextab[ord($input[$x]) % 62];
}

return $result;
Expand Down

0 comments on commit 183f68f

Please sign in to comment.