copy VersionedValue before returning to protect internal state
Change-Id: If56c512488b90bbfbabe32434e567b463d4acf1a
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/VersionedValue.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/VersionedValue.java
index 852fb07..ae6969c 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/VersionedValue.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/VersionedValue.java
@@ -38,6 +38,28 @@
return version;
}
+ /**
+ * Creates a copy of given VersionedValue.
+ *
+ * @param original VersionedValue to create a copy
+ * @return same as original if original or it's value is null,
+ * otherwise creates a copy.
+ */
+ public static VersionedValue copy(VersionedValue original) {
+ if (original == null) {
+ return null;
+ }
+ if (original.value == null) {
+ // immutable, no need to copy
+ return original;
+ } else {
+ return new VersionedValue(
+ Arrays.copyOf(original.value,
+ original.value.length),
+ original.version);
+ }
+ }
+
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
index 6d8d5bd..d132b7c 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DatabaseStateMachine.java
@@ -76,7 +76,7 @@
results.add(new InternalReadResult(InternalReadResult.Status.NO_SUCH_TABLE, null));
continue;
}
- VersionedValue value = table.get(request.key());
+ VersionedValue value = VersionedValue.copy(table.get(request.key()));
results.add(new InternalReadResult(
InternalReadResult.Status.OK,
new ReadResult(