[IOT-2710][IOT-2806] fix /pstat Update handler 55/22855/3
authorNathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
Tue, 17 Oct 2017 03:34:26 +0000 (20:34 -0700)
committerNathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
Tue, 17 Oct 2017 21:06:30 +0000 (21:06 +0000)
The way CBOR->/pstat binary is written, the Properties in the
current gPstat are added to the binary representation even if
the CBOR payload doesn't contain that Property. This may be ok
in most cases since it means that (if a Property is omitted)
the gPstat value won't be changed from whatever it is.
But this also means that if /pstat.dos.s is Updated,
the /pstat.dos.s Property Update must be done after all other
Properties, so that if a /pstat.dos.s update changes other
/pstat Properties, the new values aren't subsequently overwritten.

Change-Id: I07369355ec3141c40b5178cae41ba02e5e7813fc
Signed-off-by: Nathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
resource/csdk/security/src/pstatresource.c

index 2472753..1d7a213 100644 (file)
@@ -846,6 +846,19 @@ static OCEntityHandlerResult HandlePstatPostRequest(OCEntityHandlerRequest *ehRe
                 pstat->cm &= ~UPDATE_SOFTWARE; // Unset the cm bit, per spec
             }
 
+            // update om
+            gPstat->om = pstat->om;
+
+            // update tm
+            OIC_LOG_V(INFO, TAG, "%s setting gPstat->tm = %u", __func__, pstat->tm);
+            gPstat->tm = pstat->tm;
+
+            // update rownerID
+            gPstat->rownerID = pstat->rownerID;
+
+            // update dos LAST of all Properties, as changing dos can also
+            // change other Properties and we want the dos-asserted values
+            // to "stick" rather than being over-written by prior values.
             if (pstat->dos.state != gPstat->dos.state)
             {
                 OCStackResult stateChangeResult = OC_STACK_ERROR;
@@ -876,16 +889,6 @@ static OCEntityHandlerResult HandlePstatPostRequest(OCEntityHandlerRequest *ehRe
                 }
             }
 
-            // update om
-            gPstat->om = pstat->om;
-
-            // update tm
-            OIC_LOG_V(INFO, TAG, "%s setting gPstat->tm = %u", __func__, pstat->tm);
-            gPstat->tm = pstat->tm;
-
-            // update rownerID
-            gPstat->rownerID = pstat->rownerID;
-
             // Convert pstat data into CBOR for update to persistent storage
             if (UpdatePersistentStorage(gPstat))
             {