ソースを参照

View: Don't remove old ContinuationPoints if the session is full

Julius Pfrommer 5 年 前
コミット
79647f6fec
共有1 個のファイルを変更した7 個の追加16 個の削除を含む
  1. 7 16
      src/server/ua_services_view.c

+ 7 - 16
src/server/ua_services_view.c

@@ -524,6 +524,13 @@ Operation_Browse(UA_Server *server, UA_Session *session, const struct BrowseOpts
         return;
     }
 
+    /* Is there a ContinuationPoint available? */
+    if(session->availableContinuationPoints == 0) {
+        RefTree_clear(&cp.rt);
+        result->statusCode = UA_STATUSCODE_BADNOCONTINUATIONPOINTS;
+        return;
+    }
+
     /* Create a new continuation point. */
     ContinuationPoint *newCp = (ContinuationPoint*)UA_malloc(sizeof(ContinuationPoint));
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
@@ -546,22 +553,6 @@ Operation_Browse(UA_Server *server, UA_Session *session, const struct BrowseOpts
     if(retval != UA_STATUSCODE_GOOD)
         goto cleanup;
 
-    /* Remove the oldest continuation point if required */
-    if(session->availableContinuationPoints <= 0) {
-        struct ContinuationPoint **prev = &session->continuationPoints;
-        struct ContinuationPoint *cp2 = session->continuationPoints;
-        while(cp2 && cp2->next) {
-            prev = &cp2->next;
-            cp2 = cp2->next;
-        }
-        if(cp2) {
-            *prev = NULL;
-            ContinuationPoint_clear(cp2);
-            UA_free(cp2);
-            ++session->availableContinuationPoints;
-        }
-    }
-
     /* Attach the cp to the session */
     newCp->next = session->continuationPoints;
     session->continuationPoints = newCp;