summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-12-16 22:03:54 +0100
committerJay Berkenbilt <ejb@ql.org>2013-12-16 22:21:28 +0100
commit235d8f28f8b7de0f1fea3f8fecc5af6c3917c650 (patch)
tree519f2f91f021a5fa20794fe9b3bc3ace611a3513
parentb8b273d14d86e44101ffa73cecd38e49d1d775a5 (diff)
downloadqpdf-235d8f28f8b7de0f1fea3f8fecc5af6c3917c650.tar.zst
Increase random data provider support
Add a method to get the current random data provider, and document and test the method for resetting it.
-rw-r--r--ChangeLog7
-rw-r--r--include/qpdf/QUtil.hh13
-rw-r--r--libqpdf/QUtil.cc9
-rw-r--r--libtests/random.cc12
4 files changed, 40 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index fc880375..70ffdd48 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-12-16 Jay Berkenbilt <ejb@ql.org>
+
+ * Document and make explicit that passing null to
+ QUtil::setRandomDataProvider() resets the random data provider.
+
+ * Provide QUtil::getRandomDataProvider().
+
2013-12-14 Jay Berkenbilt <ejb@ql.org>
* 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;
}