#include "CloudComm.h"
#include "Table.h"
#include "LastMessage.h"
+#include "Mac.h"
Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_prevhmac, Array<char> *_hmac, int64_t _localSequenceNumber) :
seqnum(_seqnum),
seqnumlive(true),
freespace(SLOT_SIZE - getBaseSize()),
table(_table),
+ fakeLastMessage(NULL),
localSequenceNumber(_localSequenceNumber) {
}
seqnumlive(true),
freespace(SLOT_SIZE - getBaseSize()),
table(_table),
+ fakeLastMessage(NULL),
localSequenceNumber(_localSequenceNumber) {
- }
+}
Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSequenceNumber) :
seqnum(_seqnum),
seqnumlive(true),
freespace(SLOT_SIZE - getBaseSize()),
table(_table),
+ fakeLastMessage(NULL),
localSequenceNumber(_localSequenceNumber) {
- }
+}
+
+Slot::~Slot() {
+ if (hmac != NULL)
+ delete hmac;
+ delete prevhmac;
+ for(uint i=0; i< entries->size(); i++)
+ delete entries->get(i);
+ delete entries;
+ if (fakeLastMessage)
+ delete fakeLastMessage;
+}
Entry *Slot::addEntry(Entry *e) {
e = e->getCopy(this);
return e;
}
-void Slot::removeEntry(Entry *e) {
- entries->remove(e);
- livecount--;
- freespace += e->getSize();
-}
-
void Slot::addShallowEntry(Entry *e) {
entries->add(e);
livecount++;
return entries;
}
-Slot *Slotdecode(Table *table, Array<char> *array, Mac *mac) {
- mac->update(array, HMAC_SIZE, array.length - HMAC_SIZE);
+Slot *Slot_decode(Table *table, Array<char> *array, Mac *mac) {
+ mac->update(array, HMAC_SIZE, array->length() - HMAC_SIZE);
Array<char> *realmac = mac->doFinal();
ByteBuffer *bb = ByteBuffer_wrap(array);
bb->get(prevhmac);
if (!realmac->equals(hmac))
throw new Error("Server Error: Invalid HMAC! Potential Attack!");
-
+ delete realmac;
+
int64_t seqnum = bb->getLong();
int64_t machineid = bb->getLong();
int numentries = bb->getInt();
for (int i = 0; i < numentries; i++) {
slot->addShallowEntry(Entry_decode(slot, bb));
}
-
+ bb->releaseArray();
+ delete bb;
return slot;
}
-Array<char> *Slot::encode(Mac * mac) {
+char Slot::getType() {
+ return TypeSlot;
+}
+
+Array<char> *Slot::encode(Mac *mac) {
Array<char> *array = new Array<char>(SLOT_SIZE);
ByteBuffer *bb = ByteBuffer_wrap(array);
/* Leave space for the slot HMAC. */
bb->putLong(seqnum);
bb->putLong(machineid);
bb->putInt(entries->size());
- for (Entry *entry : entries) {
+ for (uint ei = 0; ei < entries->size(); ei++) {
+ Entry *entry = entries->get(ei);
entry->encode(bb);
}
/* Compute our HMAC */
- mac->update(array, HMAC_SIZE, array.length - HMAC_SIZE);
+ mac->update(array, HMAC_SIZE, array->length() - HMAC_SIZE);
Array<char> *realmac = mac->doFinal();
hmac = realmac;
bb->position(0);
bb->put(realmac);
+ bb->releaseArray();
+ delete bb;
return array;
}
Vector<Entry *> *Slot::getLiveEntries(bool resize) {
Vector<Entry *> *liveEntries = new Vector<Entry *>();
- for (Entry *entry : entries) {
+ for (uint ei = 0; ei < entries->size(); ei++) {
+ Entry *entry = entries->get(ei);
if (entry->isLive()) {
if (!resize || entry->getType() != TypeTableStatus)
liveEntries->add(entry);
}
}
- if (seqnumlive && !resize)
- liveEntries->add(new LastMessage(this, machineid, seqnum));
-
+ if (seqnumlive && !resize) {
+ if (! fakeLastMessage)
+ fakeLastMessage = new LastMessage(this, machineid, seqnum);
+ liveEntries->add(fakeLastMessage);
+ }
return liveEntries;
}
buffer->putLong(machineid);
int64_t localSequenceNumberShift = localSequenceNumber << 16;
buffer->putLong(localSequenceNumberShift);
- return buffer->array();
+ Array<char> * array = buffer->array();
+ buffer->releaseArray();
+ delete buffer;
+ return array;
}