diff --git a/ChangeLog b/ChangeLog index fc880375..70ffdd48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-12-16 Jay Berkenbilt + + * Document and make explicit that passing null to + QUtil::setRandomDataProvider() resets the random data provider. + + * Provide QUtil::getRandomDataProvider(). + 2013-12-14 Jay Berkenbilt * Allow anyspace rather than just newline to follow xref header. diff --git a/include/qpdf/QUtil.hh b/include/qpdf/QUtil.hh index f61fa844..7b910b71 100644 --- a/include/qpdf/QUtil.hh +++ b/include/qpdf/QUtil.hh @@ -142,9 +142,20 @@ namespace QUtil // memory for the RandomDataProvider. This method modifies a // static variable. If you are providing your own random data // provider, you should call this at the beginning of your program - // before creating any QPDF objects. + // before creating any QPDF objects. Passing a null to this + // method will reset the library back to whichever of the built-in + // random data handlers is appropriate basedon how qpdf was + // compiled. QPDF_DLL void setRandomDataProvider(RandomDataProvider*); + + // This returns the random data provider that would be used the + // next time qpdf needs random data. It will never return null. + // If no random data provider has been provided and the library + // was not compiled with any random data provider available, an + // exception will be thrown. + QPDF_DLL + RandomDataProvider* getRandomDataProvider(); }; #endif // __QUTIL_HH__ diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index c5fe535c..39ce4088 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -423,6 +423,8 @@ initialize_random_data_provider() random_data_provider = insecure_random_data_provider; } } + // QUtil.hh has comments indicating that getRandomDataProvider(), + // which calls this method, never returns null. if (random_data_provider == 0) { throw std::logic_error("QPDF has no random data provider"); @@ -435,6 +437,13 @@ QUtil::setRandomDataProvider(RandomDataProvider* p) random_data_provider = p; } +RandomDataProvider* +QUtil::getRandomDataProvider() +{ + initialize_random_data_provider(); + return random_data_provider; +} + void QUtil::initializeWithRandomBytes(unsigned char* data, size_t len) { diff --git a/libtests/random.cc b/libtests/random.cc index 0099844b..70e5135e 100644 --- a/libtests/random.cc +++ b/libtests/random.cc @@ -24,6 +24,7 @@ class BogusRandomDataProvider: public RandomDataProvider int main() { + RandomDataProvider* orig_rdp = QUtil::getRandomDataProvider(); long r1 = QUtil::random(); long r2 = QUtil::random(); if (r1 == r2) @@ -48,6 +49,11 @@ int main() #endif BogusRandomDataProvider brdp; QUtil::setRandomDataProvider(&brdp); + if (QUtil::getRandomDataProvider() != &brdp) + { + std::cout << "fail: getRandomDataProvider didn't" + " return our provider\n"; + } r1 = QUtil::random(); r2 = QUtil::random(); if (r1 != r2) @@ -63,6 +69,12 @@ int main() { std::cout << "fail: bogus random didn't provide correct bytes\n"; } + QUtil::setRandomDataProvider(0); + if (QUtil::getRandomDataProvider() != orig_rdp) + { + std::cout << "fail: passing null to setRandomDataProvider " + "didn't reset the random data provider\n"; + } std::cout << "random: end of tests\n"; return 0; }