From 3b1cb457f4e28baac062f0fe6a87ff06ed4c02e0 Mon Sep 17 00:00:00 2001
From: Sapan Bhatia <sapanb@cs.princeton.edu>
Date: Tue, 14 Oct 2008 17:04:13 +0000
Subject: [PATCH] if ((mask & space_mask.mask) != mask)

      return -EINVAL;
Looks like vc_set_space wants vc_space_mask to be present in the flags.

--
M    src/planetlab.c
---
 src/planetlab.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/planetlab.c b/src/planetlab.c
index b236b9d..447c858 100644
--- a/src/planetlab.c
+++ b/src/planetlab.c
@@ -66,7 +66,6 @@ create_context(xid_t ctx, uint64_t bcaps, uint32_t unshare_flags)
   struct vc_ctx_caps   vc_caps;
   struct vc_net_flags  vc_nf;
   struct vc_net_caps   vc_ncaps;
-  uint32_t unshare_mask;
 
   /* Create network context */
   if (vc_net_create(ctx) == VC_NOCTX) {
@@ -98,9 +97,10 @@ process:
   if (vc_ctx_create(ctx, 0) == VC_NOCTX)
     return -1;
 
-    if (unshare_mask != 0) {
-      unshare(unshare_mask);
-      vc_set_namespace(ctx, unshare_mask);
+    if (unshare_flags != 0) {
+      unshare(unshare_flags);
+      unshare_flags |= vc_space_mask();
+      vc_set_namespace(ctx, unshare_flags);
   }
 
   /* Set capabilities - these don't take effect until SETUP flag is unset */
@@ -152,15 +152,15 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr)
 
       if (vc_get_cflags(ctx, &vc_flags))
 	{
-        uint32_t unshare_mask;
+        uint32_t unshare_flags;
 	  if (errno != ESRCH)
 	    return -1;
 
        /* Unshare the net namespace if the slice if requested in the local slice configuration */
-        unshare_mask = get_space_flag(ctx);
+        unshare_flags = get_space_flag(ctx);
 
 	  /* context doesn't exist - create it */
-	  if (create_context(ctx, bcaps, unshare_mask))
+	  if (create_context(ctx, bcaps, unshare_flags))
 	    {
 	      if (errno == EEXIST)
 		/* another process beat us in a race */
@@ -192,12 +192,12 @@ pl_chcontext(xid_t ctx, uint64_t bcaps, const struct sliver_resources *slr)
     migrate:
       if (net_migrated || !vc_net_migrate(ctx))
 	{
-        uint32_t unshare_mask;
+        uint32_t unshare_flags;
       /* Unshare the net namespace if the slice if requested in the local slice configuration */
-      unshare_mask = get_space_flag(ctx);
-      if (unshare_mask != 0) {
-          vc_enter_namespace(ctx, unshare_mask);
-          unshare(unshare_mask);
+      unshare_flags = get_space_flag(ctx);
+      if (unshare_flags != 0) {
+          unshare|=vc_space_flags();
+          vc_enter_namespace(ctx, unshare_flags);
       }
 
 	  if (!vc_tag_migrate(ctx) && !vc_ctx_migrate(ctx, 0))
-- 
2.47.0