aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlloyd <[email protected]>2010-07-07 19:00:53 +0000
committerlloyd <[email protected]>2010-07-07 19:00:53 +0000
commitbb5892ce5140e21284bf736a85f45584c5b08b24 (patch)
treed5f0adc6eff034b4cb034fba85ed0611284ec5a1
parent61734fa2696ff73c213d8e801a786e538258df8e (diff)
Argh: SecureVector's constructor needs to behave differently
depending on if INITIAL_LEN is non-zero. Normal semantics are the vector will change size based on whatever it is constructed with, but that's bad in cases like SecureVector<byte, 4> val(buffer, 3); which in the past would be a 4 valued thing with 3 elements set and one zero trailing. (This construct showed up in base64 and possibly elsewhere). If INITIAL_LEN is set, use copy instead so the length does not change. C++0x cannot come soon enough.
-rw-r--r--src/alloc/secmem.h16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/alloc/secmem.h b/src/alloc/secmem.h
index bc5a2499d..cd98bff46 100644
--- a/src/alloc/secmem.h
+++ b/src/alloc/secmem.h
@@ -380,7 +380,13 @@ class SecureVector : public MemoryRegion<T>
* @param n the size of the array in
*/
SecureVector(const T in[], u32bit n)
- { init(true); set(in, n); }
+ {
+ init(true, INITIAL_LEN);
+ if(INITIAL_LEN)
+ copy(in, n);
+ else
+ set(in, n);
+ }
/**
* Create a buffer with contents specified contents.
@@ -388,7 +394,13 @@ class SecureVector : public MemoryRegion<T>
* copied into the newly created buffer.
*/
SecureVector(const MemoryRegion<T>& in)
- { init(true); set(in); }
+ {
+ init(true, INITIAL_LEN);
+ if(INITIAL_LEN)
+ copy(in);
+ else
+ set(in);
+ }
/**
* Create a buffer whose content is the concatenation of two other