Browse Source

:octocat: fixed a rare code length overflow issue

smiley 1 year ago
parent
commit
ab1f3716d9
2 changed files with 9 additions and 3 deletions
  1. 1 1
      src/Data/QRData.php
  2. 8 2
      tests/Data/DataInterfaceTestAbstract.php

+ 1 - 1
src/Data/QRData.php

@@ -195,7 +195,7 @@ final class QRData{
 
 
 		// guess the version number within the given range
 		// guess the version number within the given range
 		for($version = $this->options->versionMin; $version <= $this->options->versionMax; $version++){
 		for($version = $this->options->versionMin; $version <= $this->options->versionMax; $version++){
-			if($total <= $this->maxBitsForEcc[$version]){
+			if($total <= $this->maxBitsForEcc[$version] - 4){
 				return new Version($version);
 				return new Version($version);
 			}
 			}
 		}
 		}

+ 8 - 2
tests/Data/DataInterfaceTestAbstract.php

@@ -14,8 +14,8 @@ use chillerlan\QRCode\Common\{EccLevel, MaskPattern, Mode, Version};
 use chillerlan\QRCode\Data\{QRCodeDataException, QRData, QRDataModeInterface, QRMatrix};
 use chillerlan\QRCode\Data\{QRCodeDataException, QRData, QRDataModeInterface, QRMatrix};
 use chillerlan\QRCode\QROptions;
 use chillerlan\QRCode\QROptions;
 use chillerlan\QRCodeTest\QRMaxLengthTrait;
 use chillerlan\QRCodeTest\QRMaxLengthTrait;
+use PHPUnit\Framework\{ExpectationFailedException, TestCase};
 use Exception, Generator;
 use Exception, Generator;
-use PHPUnit\Framework\TestCase;
 use function array_map, hex2bin, mb_strlen, mb_substr, sprintf, str_repeat, strlen, substr;
 use function array_map, hex2bin, mb_strlen, mb_substr, sprintf, str_repeat, strlen, substr;
 
 
 /**
 /**
@@ -187,7 +187,13 @@ abstract class DataInterfaceTestAbstract extends TestCase{
 
 
 		$minimumVersionNumber = $this->QRData->getMinimumVersion()->getVersionNumber();
 		$minimumVersionNumber = $this->QRData->getMinimumVersion()->getVersionNumber();
 
 
-		$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
+		try{
+			$this::assertSame($version->getVersionNumber(), $minimumVersionNumber);
+		}
+		catch(ExpectationFailedException $e){
+			$this::assertSame(($version->getVersionNumber() + 1), $minimumVersionNumber, 'safety margin');
+		}
+
 		// verify the encoded data
 		// verify the encoded data
 		$this::assertSame($this->dataMode::DATAMODE, $bitBuffer->read(4));
 		$this::assertSame($this->dataMode::DATAMODE, $bitBuffer->read(4));
 		$this::assertSame($str, $this->dataMode::decodeSegment($bitBuffer, $minimumVersionNumber));
 		$this::assertSame($str, $this->dataMode::decodeSegment($bitBuffer, $minimumVersionNumber));