From d39dc833bf39314664b24470f2f572e8534b9379 Mon Sep 17 00:00:00 2001 From: srowen Date: Tue, 4 May 2010 09:25:18 +0000 Subject: [PATCH] Issue 396 git-svn-id: http://zxing.googlecode.com/svn/trunk@1333 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- cpp/core/src/zxing/MultiFormatReader.cpp | 4 +++ .../detector/MonochromeRectangleDetector.cpp | 8 +++++ cpp/core/src/zxing/oned/Code128Reader.cpp | 32 ++++++++++++------- cpp/core/src/zxing/oned/Code39Reader.cpp | 14 ++++++++ cpp/core/src/zxing/oned/ITFReader.cpp | 29 +++++++++++------ .../src/zxing/oned/MultiFormatOneDReader.cpp | 4 +++ .../zxing/oned/MultiFormatUPCEANReader.cpp | 4 +++ cpp/core/src/zxing/oned/UPCEANReader.cpp | 26 +++++++++++++-- cpp/core/src/zxing/oned/UPCEANReader.h | 2 +- 9 files changed, 99 insertions(+), 24 deletions(-) diff --git a/cpp/core/src/zxing/MultiFormatReader.cpp b/cpp/core/src/zxing/MultiFormatReader.cpp index 72b950c5..e65d0a9a 100644 --- a/cpp/core/src/zxing/MultiFormatReader.cpp +++ b/cpp/core/src/zxing/MultiFormatReader.cpp @@ -49,6 +49,10 @@ namespace zxing { throw ReaderException("No code detected"); } MultiFormatReader::~MultiFormatReader(){ + int size = readers->size(); + for (int i = 0; i < size; i++) { + delete (*readers)[i]; + } delete readers; } } \ No newline at end of file diff --git a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp index 1a39c3e0..25d6db63 100644 --- a/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp +++ b/cpp/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp @@ -86,12 +86,15 @@ Ref MonochromeRectangleDetector::findCornerFromCenter(int centerX, if (lastRange[1] > centerX) { // straddle, choose one or the other based on direction Ref result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY)); + delete [] lastRange; return result; } Ref result(new CornerPoint(lastRange[0], lastY)); + delete [] lastRange; return result; } else { Ref result(new CornerPoint(lastRange[1], lastY)); + delete [] lastRange; return result; } } else { @@ -99,19 +102,24 @@ Ref MonochromeRectangleDetector::findCornerFromCenter(int centerX, if (lastRange[0] < centerY) { if (lastRange[1] > centerY) { Ref result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1])); + delete [] lastRange; return result; } Ref result(new CornerPoint(lastX, lastRange[0])); + delete [] lastRange; return result; } else { Ref result(new CornerPoint(lastX, lastRange[1])); + delete [] lastRange; return result; } } } } + delete [] lastRange; lastRange = range; } + delete [] lastRange; throw ReaderException("Couldn't find corners"); } diff --git a/cpp/core/src/zxing/oned/Code128Reader.cpp b/cpp/core/src/zxing/oned/Code128Reader.cpp index 943a5748..6f638d56 100644 --- a/cpp/core/src/zxing/oned/Code128Reader.cpp +++ b/cpp/core/src/zxing/oned/Code128Reader.cpp @@ -28,9 +28,9 @@ namespace zxing { namespace oned { - const int CODE_PATTERNS_LENGHT = 107; - const int countersLenght = 6; - static const int CODE_PATTERNS[CODE_PATTERNS_LENGHT][countersLenght] = { + const int CODE_PATTERNS_LENGTH = 107; + const int countersLength = 6; + static const int CODE_PATTERNS[CODE_PATTERNS_LENGTH][countersLength] = { {2, 1, 2, 2, 2, 2}, /* 0 */ {2, 2, 2, 1, 2, 2}, {2, 2, 2, 2, 2, 1}, @@ -155,7 +155,7 @@ namespace zxing { } int counterPosition = 0; - int counters[countersLenght] = {0,0,0,0,0,0}; + int counters[countersLength] = {0,0,0,0,0,0}; int patternStart = rowOffset; bool isWhite = false; int patternLength = sizeof(counters) / sizeof(int); @@ -206,13 +206,13 @@ namespace zxing { recordPattern(row, rowOffset, counters, countersCount); int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestMatch = -1; - for (int d = 0; d < CODE_PATTERNS_LENGHT; d++) { - int pattern[countersLenght]; + for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) { + int pattern[countersLength]; - for(int ind = 0; ind< countersLenght; ind++){ + for(int ind = 0; ind< countersLength; ind++){ pattern[ind] = CODE_PATTERNS[d][ind]; } -// memcpy(pattern, CODE_PATTERNS[d], countersLenght); +// memcpy(pattern, CODE_PATTERNS[d], countersLength); int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE); if (variance < bestVariance) { bestVariance = variance; @@ -243,6 +243,7 @@ namespace zxing { codeSet = CODE_CODE_C; break; default: + delete [] startPatternInfo; throw ReaderException(""); } @@ -254,7 +255,7 @@ namespace zxing { int lastStart = startPatternInfo[0]; int nextStart = startPatternInfo[1]; - int counters[countersLenght] = {0,0,0,0,0,0}; + int counters[countersLength] = {0,0,0,0,0,0}; int lastCode = 0; int code = 0; @@ -271,7 +272,12 @@ namespace zxing { lastCode = code; // Decode another code from image + try { code = decodeCode(row, counters, sizeof(counters)/sizeof(int), nextStart); + } catch (ReaderException re) { + delete [] startPatternInfo; + throw re; + } // Remember whether the last code was printable or not (excluding CODE_STOP) if (code != CODE_STOP) { @@ -286,8 +292,8 @@ namespace zxing { // Advance to where the next code will to start lastStart = nextStart; - int _countersLenght = sizeof(counters) / sizeof(int); - for (int i = 0; i < _countersLenght; i++) { + int _countersLength = sizeof(counters) / sizeof(int); + for (int i = 0; i < _countersLength; i++) { nextStart += counters[i]; } @@ -296,6 +302,7 @@ namespace zxing { case CODE_START_A: case CODE_START_B: case CODE_START_C: + delete [] startPatternInfo; throw ReaderException(""); } @@ -418,6 +425,7 @@ namespace zxing { nextStart++; } if (!row->isRange(nextStart, fminl(width, nextStart + (nextStart - lastStart) / 2), false)) { + delete [] startPatternInfo; throw ReaderException(""); } @@ -425,6 +433,7 @@ namespace zxing { checksumTotal -= multiplier * lastCode; // lastCode is the checksum then: if (checksumTotal % 103 != lastCode) { + delete [] startPatternInfo; throw ReaderException(""); } @@ -444,6 +453,7 @@ namespace zxing { // String resultString(tmpResultString); if (tmpResultString.length() == 0) { + delete [] startPatternInfo; // Almost surely a false positive throw ReaderException(""); } diff --git a/cpp/core/src/zxing/oned/Code39Reader.cpp b/cpp/core/src/zxing/oned/Code39Reader.cpp index cb03dd9a..fbf25801 100644 --- a/cpp/core/src/zxing/oned/Code39Reader.cpp +++ b/cpp/core/src/zxing/oned/Code39Reader.cpp @@ -94,9 +94,15 @@ namespace zxing { char decodedChar; int lastStart; do { + try { recordPattern(row, nextStart, counters, countersLen); + } catch (ReaderException re) { + delete [] start; + throw re; + } int pattern = toNarrowWidePattern(counters, countersLen); if (pattern < 0) { + delete [] start; throw ReaderException("pattern < 0"); } decodedChar = patternToChar(pattern); @@ -117,10 +123,14 @@ namespace zxing { for (int i = 0; i < countersLen; i++) { lastPatternSize += counters[i]; } + // IS begin + delete [] counters; + // IS end int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize; // If 50% of last pattern size, following last pattern, is not whitespace, fail // (but if it's whitespace to the very end of the image, that's OK) if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) { + delete [] start; throw ReaderException("too short end white space"); } @@ -146,6 +156,7 @@ namespace zxing { } if (tmpResultString.length() == 0) { + delete [] start; // Almost surely a false positive throw ReaderException(""); } @@ -216,6 +227,9 @@ namespace zxing { isWhite = !isWhite; } } + // IS begin + delete [] counters; + // IS end throw ReaderException(""); } diff --git a/cpp/core/src/zxing/oned/ITFReader.cpp b/cpp/core/src/zxing/oned/ITFReader.cpp index e38ab216..c00ba567 100644 --- a/cpp/core/src/zxing/oned/ITFReader.cpp +++ b/cpp/core/src/zxing/oned/ITFReader.cpp @@ -70,10 +70,22 @@ namespace zxing { Ref ITFReader::decodeRow(int rowNumber, Ref row){ // Find out where the Middle section (payload) starts & ends int* startRange = decodeStart(row); - int* endRange = decodeEnd(row); + int* endRange; + try { + endRange = decodeEnd(row); + } catch (Exception e) { + delete [] startRange; + throw e; + } std::string tmpResult; + try { decodeMiddle(row, startRange[1], endRange[0], tmpResult); + } catch (zxing::ReaderException re) { + delete [] startRange; + delete [] endRange; + throw re; + } // To avoid false positives with 2D barcodes (and other patterns), make // an assumption that the decoded string must be 6, 10 or 14 digits. @@ -83,7 +95,9 @@ namespace zxing { lengthOK = true; } if (!lengthOK) { - throw ReaderException("not enought characters count"); + delete [] startRange; + delete [] endRange; + throw ReaderException("not enough characters count"); } Ref resultString(new String(tmpResult)); @@ -116,13 +130,13 @@ namespace zxing { // Therefore, need to scan 10 lines and then // split these into two arrays int counterDigitPairLen = 10; - int* counterDigitPair = new int[counterDigitPairLen]; + int counterDigitPair[counterDigitPairLen]; for (int i=0; isize(); + for (int i = 0; i < size; i++) { + delete (*readers)[i]; + } delete readers; } } diff --git a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp index 61011f0f..43319110 100644 --- a/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +++ b/cpp/core/src/zxing/oned/MultiFormatUPCEANReader.cpp @@ -73,6 +73,10 @@ namespace zxing { } MultiFormatUPCEANReader::~MultiFormatUPCEANReader(){ + int size = readers->size(); + for (int i = 0; i < size; i++) { + delete (*readers)[i]; + } delete readers; } } diff --git a/cpp/core/src/zxing/oned/UPCEANReader.cpp b/cpp/core/src/zxing/oned/UPCEANReader.cpp index 5345cad9..b5923bf9 100644 --- a/cpp/core/src/zxing/oned/UPCEANReader.cpp +++ b/cpp/core/src/zxing/oned/UPCEANReader.cpp @@ -100,7 +100,16 @@ namespace zxing { std::string tmpResultString; std::string& tmpResultStringRef = tmpResultString; - int endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef); + int endStart; + try { + endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef); + } catch (ReaderException re) { + if (startGuardRange!=NULL) { + delete [] startGuardRange; + startGuardRange = NULL; + } + throw re; + } int* endRange = decodeEnd(row, endStart); @@ -114,6 +123,14 @@ namespace zxing { // } if (!checkChecksum(tmpResultString)) { + if (startGuardRange!=NULL) { + delete [] startGuardRange; + startGuardRange = NULL; + } + if (endRange!=NULL) { + delete [] endRange; + endRange = NULL; + } throw ReaderException("Checksum fail."); } @@ -159,6 +176,9 @@ namespace zxing { if (quietStart >= 0) { foundStart = row->isRange(quietStart, start, false); } + if (!foundStart) { + delete [] startRange; + } } return startRange; } @@ -217,13 +237,13 @@ namespace zxing { } // int UPCEANReader::decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, int** patterns/*[][]*/, int paterns1Len, int paterns2Len) - int UPCEANReader::decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType){ + int UPCEANReader::decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType){ recordPattern(row, rowOffset, counters, countersLen); int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestMatch = -1; int max = 0; - switch (paternType) { + switch (patternType) { case UPC_EAN_PATTERNS_L_PATTERNS: max = L_PATTERNS_LEN; for (int i = 0; i < max; i++) { diff --git a/cpp/core/src/zxing/oned/UPCEANReader.h b/cpp/core/src/zxing/oned/UPCEANReader.h index 8f825c26..a6c155d8 100644 --- a/cpp/core/src/zxing/oned/UPCEANReader.h +++ b/cpp/core/src/zxing/oned/UPCEANReader.h @@ -54,7 +54,7 @@ namespace zxing { Ref decodeRow(int rowNumber, Ref row); Ref decodeRow(int rowNumber, Ref row, int startGuardRange[]); - static int decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType); //throws ReaderException + static int decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType); //throws ReaderException bool checkChecksum(std::string s); //throws ReaderException -- 2.20.1