goo/GooString.cc | 5 +-- poppler/Function.cc | 63 ++++++++++++++++++++++++++++++++++-------- poppler/Function.h | 11 ++++--- qt4/tests/CMakeLists.txt | 1 qt4/tests/Makefile.am | 7 ++++ qt4/tests/check_goostring.cpp | 22 ++++++++++++++ 6 files changed, 90 insertions(+), 19 deletions(-)
New commits: commit 62c0dbbe9f1987c78eeb87f248d35e7fd73e968a Author: Albert Astals Cid <[email protected]> Date: Mon Nov 26 00:40:57 2012 +0100 Check GooString::insert Checks we don't break what we just fixed with Pino's patch diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt index 9eaaa02..187870f 100644 --- a/qt4/tests/CMakeLists.txt +++ b/qt4/tests/CMakeLists.txt @@ -57,6 +57,7 @@ qt4_add_qtest(check_permissions check_permissions.cpp) qt4_add_qtest(check_search check_search.cpp) qt4_add_qtest(check_actualtext check_actualtext.cpp) qt4_add_qtest(check_lexer check_lexer.cpp) +qt4_add_qtest(check_goostring check_goostring.cpp) if (NOT WIN32) qt4_add_qtest(check_strings check_strings.cpp) endif (NOT WIN32) diff --git a/qt4/tests/Makefile.am b/qt4/tests/Makefile.am index ed38d17..3dc6e13 100644 --- a/qt4/tests/Makefile.am +++ b/qt4/tests/Makefile.am @@ -78,7 +78,8 @@ TESTS = \ check_pagelayout \ check_search \ check_strings \ - check_lexer + check_lexer \ + check_goostring check_PROGRAMS = $(TESTS) @@ -138,5 +139,9 @@ check_lexer_SOURCES = check_lexer.cpp check_lexer.$(OBJEXT): check_lexer.moc check_lexer_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) +check_goostring_SOURCES = check_goostring.cpp +check_goostring.$(OBJEXT): check_goostring.moc +check_goostring_LDADD = $(LDADDS) $(POPPLER_QT4_TEST_LIBS) + endif diff --git a/qt4/tests/check_goostring.cpp b/qt4/tests/check_goostring.cpp new file mode 100644 index 0000000..41c28d3 --- /dev/null +++ b/qt4/tests/check_goostring.cpp @@ -0,0 +1,22 @@ +#include <QtTest/QtTest> + +#include "GooString.h" + +class TestGooString : public QObject +{ + Q_OBJECT +private slots: + void testInsert(); +}; + +void TestGooString::testInsert() +{ + GooString goo; + goo.insert(0, "."); + goo.insert(0, "This is a very long long test string"); + QCOMPARE(goo.getCString(), "This is a very long long test string."); +} + +QTEST_MAIN(TestGooString) +#include "check_goostring.moc" + commit 01e438ca47776075c8171bda090e7d859fd9f620 Author: Adam Reichold <[email protected]> Date: Mon Nov 26 00:39:05 2012 +0100 Don't use memcpy to copy classes diff --git a/poppler/Function.cc b/poppler/Function.cc index d26aed8..1dece2d 100644 --- a/poppler/Function.cc +++ b/poppler/Function.cc @@ -18,6 +18,7 @@ // Copyright (C) 2010 Christian Feuersänger <[email protected]> // Copyright (C) 2011 Andrea Canciani <[email protected]> // Copyright (C) 2012 Thomas Freitag <[email protected]> +// Copyright (C) 2012 Adam Reichold <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -106,6 +107,16 @@ Function *Function::parse(Object *funcObj, std::set<int> *usedParents) { return func; } +Function::Function(const Function *func) { + m = func->m; + n = func->n; + + memcpy(domain, func->domain, funcMaxInputs * 2 * sizeof(double)); + memcpy(range, func->range, funcMaxOutputs * 2 * sizeof(double)); + + hasRange = func->hasRange; +} + GBool Function::init(Dict *dict) { Object obj1, obj2; int i; @@ -419,13 +430,28 @@ SampledFunction::~SampledFunction() { } } -SampledFunction::SampledFunction(SampledFunction *func) { - memcpy(this, func, sizeof(SampledFunction)); +SampledFunction::SampledFunction(const SampledFunction *func) : Function(func) { + memcpy(sampleSize, func->sampleSize, funcMaxInputs * sizeof(int)); + + memcpy(encode, func->encode, funcMaxInputs * 2 * sizeof(double)); + memcpy(decode, func->decode, funcMaxOutputs * 2 * sizeof(double)); + + memcpy(inputMul, func->inputMul, funcMaxInputs * sizeof(double)); + + nSamples = func->nSamples; + idxOffset = (int *)gmallocn(1 << m, sizeof(int)); memcpy(idxOffset, func->idxOffset, (1 << m) * (int)sizeof(int)); + samples = (double *)gmallocn(nSamples, sizeof(double)); memcpy(samples, func->samples, nSamples * sizeof(double)); + sBuf = (double *)gmallocn(1 << m, sizeof(double)); + + memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); + memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); + + ok = func->ok; } void SampledFunction::transform(double *in, double *out) { @@ -616,8 +642,13 @@ ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { ExponentialFunction::~ExponentialFunction() { } -ExponentialFunction::ExponentialFunction(ExponentialFunction *func) { - memcpy(this, func, sizeof(ExponentialFunction)); +ExponentialFunction::ExponentialFunction(const ExponentialFunction *func) : Function(func) { + memcpy(c0, func->c0, funcMaxOutputs * sizeof(double)); + memcpy(c1, func->c1, funcMaxOutputs * sizeof(double)); + + e = func->e; + isLinear = func->isLinear; + ok = func->ok; } void ExponentialFunction::transform(double *in, double *out) { @@ -761,21 +792,24 @@ StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict, std::set<int> obj1.free(); } -StitchingFunction::StitchingFunction(StitchingFunction *func) { - int i; +StitchingFunction::StitchingFunction(const StitchingFunction *func) : Function(func) { + k = func->k; - memcpy(this, func, sizeof(StitchingFunction)); funcs = (Function **)gmallocn(k, sizeof(Function *)); - for (i = 0; i < k; ++i) { + for (int i = 0; i < k; ++i) { funcs[i] = func->funcs[i]->copy(); } + bounds = (double *)gmallocn(k + 1, sizeof(double)); memcpy(bounds, func->bounds, (k + 1) * sizeof(double)); + encode = (double *)gmallocn(2 * k, sizeof(double)); memcpy(encode, func->encode, 2 * k * sizeof(double)); + scale = (double *)gmallocn(k, sizeof(double)); memcpy(scale, func->scale, k * sizeof(double)); - ok = gTrue; + + ok = func->ok; } StitchingFunction::~StitchingFunction() { @@ -1184,11 +1218,18 @@ PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) { return; } -PostScriptFunction::PostScriptFunction(PostScriptFunction *func) { - memcpy(this, func, sizeof(PostScriptFunction)); +PostScriptFunction::PostScriptFunction(const PostScriptFunction *func) : Function(func) { + codeSize = func->codeSize; + code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); memcpy(code, func->code, codeSize * sizeof(PSObject)); + codeString = func->codeString->copy(); + + memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); + memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); + + ok = func->ok; } PostScriptFunction::~PostScriptFunction() { diff --git a/poppler/Function.h b/poppler/Function.h index 25df133..90e2a76 100644 --- a/poppler/Function.h +++ b/poppler/Function.h @@ -17,6 +17,7 @@ // Copyright (C) 2010 Christian Feuersänger <[email protected]> // Copyright (C) 2011 Andrea Canciani <[email protected]> // Copyright (C) 2012 Thomas Freitag <[email protected]> +// Copyright (C) 2012 Adam Reichold <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -90,6 +91,8 @@ public: protected: static Function *parse(Object *funcObj, std::set<int> *usedParents); + Function(const Function *func); + int m, n; // size of input and output tuples double // min and max values for function domain domain[funcMaxInputs][2]; @@ -140,7 +143,7 @@ public: private: - SampledFunction(SampledFunction *func); + SampledFunction(const SampledFunction *func); int // number of samples for each domain element sampleSize[funcMaxInputs]; @@ -179,7 +182,7 @@ public: private: - ExponentialFunction(ExponentialFunction *func); + ExponentialFunction(const ExponentialFunction *func); double c0[funcMaxOutputs]; double c1[funcMaxOutputs]; @@ -210,7 +213,7 @@ public: private: - StitchingFunction(StitchingFunction *func); + StitchingFunction(const StitchingFunction *func); int k; Function **funcs; @@ -238,7 +241,7 @@ public: private: - PostScriptFunction(PostScriptFunction *func); + PostScriptFunction(const PostScriptFunction *func); GBool parseCode(Stream *str, int *codePtr); GooString *getToken(Stream *str); void resizeCode(int newSize); commit 7ba15d11e56175601104d125d5e4a47619c224bf Author: Pino Toscano <[email protected]> Date: Mon Nov 26 00:29:35 2012 +0100 fix GooString::insert() Hi, as reported in a Debian bug [1], it seems GooString::insert could lead to using uninitialized memory. The case is a simple: GooString goo; goo.insert(0, "."); goo.insert(0, "This is a very long long test string"); i.e. basically first insert a single character at position 0, and then a string longer than STR_STATIC_SIZE always at position 0. [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=693817 diff --git a/goo/GooString.cc b/goo/GooString.cc index 451a70e..e52380e 100644 --- a/goo/GooString.cc +++ b/goo/GooString.cc @@ -22,6 +22,7 @@ // Copyright (C) 2011 Kenji Uno <[email protected]> // Copyright (C) 2012 Fabio D'Urso <[email protected]> // Copyright (C) 2012 Adrian Johnson <[email protected]> +// Copyright (C) 2012 Pino Toscano <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -769,14 +770,12 @@ GooString *GooString::insert(int i, GooString *str) { } GooString *GooString::insert(int i, const char *str, int lengthA) { - int j; int prevLen = length; if (CALC_STRING_LEN == lengthA) lengthA = strlen(str); resize(length + lengthA); - for (j = prevLen; j >= i; --j) - s[j+lengthA] = s[j]; + memmove(s+i+lengthA, s+i, prevLen); memcpy(s+i, str, lengthA); return this; }
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
