edits
[iotcloud.git] / version2 / src / C / Slot.cc
index 542705e44ce3698dbb2ec269ee302cd86ef09583..6f37c9a52f519c7a2718e0444bfe91f2051b6100 100644 (file)
@@ -5,6 +5,7 @@
 #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),
@@ -16,6 +17,7 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        seqnumlive(true),
        freespace(SLOT_SIZE - getBaseSize()),
        table(_table),
+       fakeLastMessage(NULL),
        localSequenceNumber(_localSequenceNumber) {
 }
 
@@ -29,8 +31,9 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, Array<char> *_pre
        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),
@@ -42,8 +45,20 @@ Slot::Slot(Table *_table, int64_t _seqnum, int64_t _machineid, int64_t _localSeq
        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);
@@ -53,12 +68,6 @@ Entry *Slot::addEntry(Entry *e) {
        return e;
 }
 
-void Slot::removeEntry(Entry *e) {
-       entries->remove(e);
-       livecount--;
-       freespace += e->getSize();
-}
-
 void Slot::addShallowEntry(Entry *e) {
        entries->add(e);
        livecount++;
@@ -78,8 +87,8 @@ Vector<Entry *> *Slot::getEntries() {
        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);
@@ -89,7 +98,8 @@ Slot *Slotdecode(Table *table, Array<char> *array, Mac *mac) {
        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();
@@ -98,11 +108,16 @@ Slot *Slotdecode(Table *table, Array<char> *array, Mac *mac) {
        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.  */
@@ -111,15 +126,18 @@ Array<char> *Slot::encode(Mac * mac) {
        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;
 }
 
@@ -132,16 +150,19 @@ Array<char> *Slot::encode(Mac * mac) {
 
 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;
 }
 
@@ -172,5 +193,8 @@ Array<char> *Slot::getSlotCryptIV() {
        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;
 }