API: More gracefully fail when opening shared memory segment fails. 79/8079/3
authorOle Troan <ot@cisco.com>
Thu, 17 Aug 2017 09:07:33 +0000 (11:07 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Fri, 18 Aug 2017 16:46:30 +0000 (16:46 +0000)
API clients would fail with an ASSERT (and core dump) whenever
the API shared memory segment could not be opened.
This returns an error value to the client's connect instead.

Change-Id: Id122a3a090b24b139c382ae09f341bde61fd2540
Signed-off-by: Ole Troan <ot@cisco.com>
src/svm/svm.c
src/svm/svm_common.h
src/vlibmemory/memory_shared.c

index 0442ecb..663324e 100644 (file)
@@ -733,7 +733,7 @@ svm_mutex_cleanup (void)
     }
 }
 
-static void
+static int
 svm_region_init_internal (svm_map_region_args_t * a)
 {
   svm_region_t *rp;
@@ -742,7 +742,7 @@ svm_region_init_internal (svm_map_region_args_t * a)
 
   /* guard against klutz calls */
   if (root_rp)
-    return;
+    return -1;
 
   root_rp_refcount++;
 
@@ -757,7 +757,8 @@ svm_region_init_internal (svm_map_region_args_t * a)
   a->baseva += randomize_baseva;
 
   rp = svm_map_region (a);
-  ASSERT (rp);
+  if (!rp)
+    return -1;
 
   region_lock (rp, 3);
 
@@ -778,6 +779,8 @@ svm_region_init_internal (svm_map_region_args_t * a)
     }
   region_unlock (rp);
   root_rp = rp;
+
+  return 0;
 }
 
 void
@@ -797,7 +800,7 @@ svm_region_init (void)
   svm_region_init_internal (a);
 }
 
-void
+int
 svm_region_init_chroot (const char *root_path)
 {
   svm_map_region_args_t _a, *a = &_a;
@@ -811,7 +814,7 @@ svm_region_init_chroot (const char *root_path)
   a->uid = 0;
   a->gid = 0;
 
-  svm_region_init_internal (a);
+  return svm_region_init_internal (a);
 }
 
 void
index 1f18443..1f6d83c 100644 (file)
@@ -110,7 +110,7 @@ typedef struct
 
 void *svm_region_find_or_create (svm_map_region_args_t * a);
 void svm_region_init (void);
-void svm_region_init_chroot (const char *root_path);
+int svm_region_init_chroot (const char *root_path);
 void svm_region_init_chroot_uid_gid (const char *root_path, int uid, int gid);
 void svm_region_init_args (svm_map_region_args_t * a);
 void svm_region_exit (void);
index 9bab657..fbdabd0 100644 (file)
@@ -337,7 +337,7 @@ vl_map_shmem (const char *region_name, int is_vlib)
   void *oldheap;
   vl_shmem_hdr_t *shmem_hdr = 0;
   api_main_t *am = &api_main;
-  int i;
+  int i, rv;
   struct timespec ts, tsrem;
   u32 vlib_input_queue_length;
 
@@ -352,7 +352,11 @@ vl_map_shmem (const char *region_name, int is_vlib)
     }
 
   if (is_vlib == 0)
-    svm_region_init_chroot (am->root_path);
+    {
+      rv = svm_region_init_chroot (am->root_path);
+      if (rv)
+       return rv;
+    }
 
   if (a->root_path != NULL)
     {