]> Zhao Yanbai Git Server - minix.git/commitdiff
Kernel/RS: fix permission computation with 32+ system processes
authorDavid van Moolenbroek <david@minix3.org>
Tue, 7 Dec 2010 10:32:42 +0000 (10:32 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 7 Dec 2010 10:32:42 +0000 (10:32 +0000)
include/minix/priv.h
kernel/const.h
kernel/main.c
kernel/proto.h
kernel/system.c
kernel/system/do_privctl.c
servers/rs/main.c
servers/rs/manager.c
servers/rs/proto.h
servers/rs/utility.c

index 07fe1a5e8750b8c0d6f822b09fcdd5e7c7b21ae7..03c0665c82ed405e052b00815a8d83b404e980ea 100644 (file)
  */
 #define NULL_PRIV_ID   (-1)
 
+/* Allowed targets. */
+#define NO_M      (-1)              /* no targets allowed */
+#define ALL_M     (-2)              /* all targets allowed */
+
 /* Allowed calls. */
 #define NO_C      (-1)              /* no calls allowed */
 #define ALL_C     (-2)              /* all calls allowed */
 #define USR_T     (1 << SENDREC)                   /* user processes */
 
 /* allowed targets */
-#define TSK_M     0                                /* all kernel tasks */
-#define SRV_M     (~0)                             /* system services */
-#define DSRV_M    (~0)                             /* dynamic system services */
-#define USR_M     (~0)                             /* user processes */
+#define TSK_M     NO_M                             /* all kernel tasks */
+#define SRV_M     ALL_M                            /* system services */
+#define DSRV_M    ALL_M                            /* dynamic system services */
+#define USR_M     ALL_M                            /* user processes */
 
 /* allowed kernel calls */
 #define TSK_KC    NO_C                             /* all kernel tasks */
index 55ddc274369d7cddb5cab2705788222fbf641d57..f5b7edbcbde7c1555b8fb8f70c800a542e316c63 100644 (file)
 #define _DST_  1
 
 #define get_sys_bit(map,bit) \
-       ( MAP_CHUNK(map.chunk,bit) & (1 << CHUNK_OFFSET(bit) ))
+       ( MAP_CHUNK((map).chunk,bit) & (1 << CHUNK_OFFSET(bit) ))
 #define get_sys_bits(map,bit) \
-       ( MAP_CHUNK(map.chunk,bit) )
+       ( MAP_CHUNK((map).chunk,bit) )
 #define set_sys_bit(map,bit) \
-       ( MAP_CHUNK(map.chunk,bit) |= (1 << CHUNK_OFFSET(bit) ))
+       ( MAP_CHUNK((map).chunk,bit) |= (1 << CHUNK_OFFSET(bit) ))
 #define unset_sys_bit(map,bit) \
-       ( MAP_CHUNK(map.chunk,bit) &= ~(1 << CHUNK_OFFSET(bit) ))
+       ( MAP_CHUNK((map).chunk,bit) &= ~(1 << CHUNK_OFFSET(bit) ))
 
 /* args to intr_init() */
 #define INTS_ORIG      0       /* restore interrupts */
index 108ef99eb4f0e2ab2c85de55d0f8a4caacc4d266..7a3770b2b345795ad40a6c31f1e92e796c847d81 100644 (file)
@@ -156,6 +156,7 @@ PUBLIC int main(void)
        int schedulable_proc;
        proc_nr_t proc_nr;
        int ipc_to_m, kcalls;
+       sys_map_t map;
 
        ip = &image[i];                         /* process' attributes */
        DEBUGEXTRA(("initializing %s... ", ip->proc_name));
@@ -205,7 +206,14 @@ PUBLIC int main(void)
             }
 
             /* Fill in target mask. */
-            fill_sendto_mask(rp, ipc_to_m);
+            memset(&map, 0, sizeof(map));
+
+            if (ipc_to_m == ALL_M) {
+                for(j = 0; j < NR_SYS_PROCS; j++)
+                    set_sys_bit(map, j);
+            }
+
+            fill_sendto_mask(rp, &map);
 
             /* Fill in kernel call mask. */
             for(j = 0; j < SYS_CALL_MASK_SIZE; j++) {
index 0a628ab049771f7ac5c4faa1752185581e842ac4..844467d90b6511e0da250db6ec3484f98bcfc6aa 100644 (file)
@@ -73,7 +73,8 @@ _PROTOTYPE( char *env_get, (const char *key));
 _PROTOTYPE( int get_priv, (register struct proc *rc, int proc_type)    );
 _PROTOTYPE( void set_sendto_bit, (const struct proc *rc, int id)       );
 _PROTOTYPE( void unset_sendto_bit, (const struct proc *rc, int id)     );
-_PROTOTYPE( void fill_sendto_mask, (const struct proc *rc, int mask)   );
+_PROTOTYPE( void fill_sendto_mask, (const struct proc *rc,
+                                                       sys_map_t *map) );
 _PROTOTYPE( void send_sig, (endpoint_t proc_nr, int sig_nr)            );
 _PROTOTYPE( void cause_sig, (proc_nr_t proc_nr, int sig_nr)                    );
 _PROTOTYPE( void sig_delay_done, (struct proc *rp)                     );
index 434abf1b67863a5c01ab7feda93dad2cd78289f1..e5e3708753d575a7c146a05e5150bb7f0575b614 100644 (file)
@@ -339,12 +339,12 @@ PUBLIC void unset_sendto_bit(const struct proc *rp, int id)
 /*===========================================================================*
  *                           fill_sendto_mask                               *
  *===========================================================================*/
-PUBLIC void fill_sendto_mask(const struct proc *rp, int mask)
+PUBLIC void fill_sendto_mask(const struct proc *rp, sys_map_t *map)
 {
   int i;
 
   for (i=0; i < NR_SYS_PROCS; i++) {
-       if (mask & (1 << i))
+       if (get_sys_bit(*map, i))
                set_sendto_bit(rp, i);
        else
                unset_sendto_bit(rp, i);
index 485b21eabb19b131bbaf06adb87f8ee7d3cfdeba..d8703063ef8be13c3c8833ccc03537f3c7862c58 100644 (file)
@@ -30,6 +30,7 @@ PUBLIC int do_privctl(struct proc * caller, message * m_ptr)
   struct proc *rp;
   proc_nr_t proc_nr;
   sys_id_t priv_id;
+  sys_map_t map;
   int ipc_to_m, kcalls;
   int i, r;
   struct io_range io_range;
@@ -119,8 +120,13 @@ PUBLIC int do_privctl(struct proc * caller, message * m_ptr)
        /* Set defaults for privilege bitmaps. */
        priv(rp)->s_flags= DSRV_F;           /* privilege flags */
        priv(rp)->s_trap_mask= DSRV_T;       /* allowed traps */
+       memset(&map, 0, sizeof(map));
        ipc_to_m = DSRV_M;                   /* allowed targets */
-       fill_sendto_mask(rp, ipc_to_m);
+       if (ipc_to_m == ALL_M) {
+               for (i = 0; i < NR_SYS_PROCS; i++)
+                       set_sys_bit(map, i);
+       }
+       fill_sendto_mask(rp, &map);
        kcalls = DSRV_KC;                    /* allowed kernel calls */
        for(i = 0; i < SYS_CALL_MASK_SIZE; i++) {
                priv(rp)->s_k_call_mask[i] = (kcalls == NO_C ? 0 : (~0));
@@ -294,7 +300,7 @@ PRIVATE int update_priv(struct proc *rp, struct priv *priv)
 {
 /* Update the privilege structure of a given process. */
 
-  int ipc_to_m, i;
+  int i;
 
   /* Copy s_flags and signal managers. */
   priv(rp)->s_flags = priv->s_flags;
@@ -362,8 +368,7 @@ PRIVATE int update_priv(struct proc *rp, struct priv *priv)
   printf("\n");
 #endif
 
-  memcpy(&ipc_to_m, &priv->s_ipc_to, sizeof(ipc_to_m));
-  fill_sendto_mask(rp, ipc_to_m);
+  fill_sendto_mask(rp, &priv->s_ipc_to);
 
 #if PRIV_DEBUG
   printf("do_privctl: Set ipc target mask for %d:");
index 21bdedf835f2b6ffa271a7a15c24c0ac1738f140..6070630766f7d845b748d9ba8ae0123e7470ec9f 100644 (file)
@@ -165,7 +165,7 @@ PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
 {
 /* Initialize the reincarnation server. */
   struct boot_image *ip;
-  int s,i,j;
+  int s,i;
   int nr_image_srvs, nr_image_priv_srvs, nr_uncaught_init_srvs;
   struct rproc *rp;
   struct rproc *replica_rp;
@@ -272,7 +272,7 @@ PRIVATE int sef_cb_init_fresh(int type, sef_init_info_t *info)
       rp->r_priv.s_flags = boot_image_priv->flags;          /* priv flags */
       rp->r_priv.s_trap_mask= SRV_OR_USR(rp, SRV_T, USR_T); /* traps */
       ipc_to = SRV_OR_USR(rp, SRV_M, USR_M);                /* targets */
-      memcpy(&rp->r_priv.s_ipc_to, &ipc_to, sizeof(rp->r_priv.s_ipc_to));
+      fill_send_mask(&rp->r_priv.s_ipc_to, ipc_to == ALL_M);
       rp->r_priv.s_sig_mgr= SRV_OR_USR(rp, SRV_SM, USR_SM); /* sig mgr */
       rp->r_priv.s_bak_sig_mgr = NONE;                      /* backup sig mgr */
       
index 9dfe41476491662a009bb7ca09246e0a69847e16..2419de3842d09027269632dcfd3d10cfa4fdb541 100644 (file)
@@ -1988,7 +1988,7 @@ struct priv *privp;
        int is_ipc_all, is_ipc_all_sys;
 
        /* Clear s_ipc_to */
-       memset(&privp->s_ipc_to, '\0', sizeof(privp->s_ipc_to));
+       fill_send_mask(&privp->s_ipc_to, FALSE);
 
        is_ipc_all = !strcmp(rp->r_ipc_list, RSS_IPC_ALL);
        is_ipc_all_sys = !strcmp(rp->r_ipc_list, RSS_IPC_ALL_SYS);
index ccadb4724e46987a5513037e405588376eb15732..0dc45b56a95344e8e67978f19a8caa331c35a9dd 100644 (file)
@@ -90,6 +90,7 @@ _PROTOTYPE( void end_update, (int result, int reply_flag) );
 
 /* utility.c */
 _PROTOTYPE( int init_service, (struct rproc *rp, int type));
+_PROTOTYPE( void fill_send_mask, (sys_map_t *send_mask, int set_bits));
 _PROTOTYPE(void fill_call_mask, ( int *calls, int tot_nr_calls,
        bitchunk_t *call_mask, int call_base, int is_init));
 _PROTOTYPE( char* srv_to_string, (struct rproc *rp));
index c32ecbd22b72ce6625ddcbd0fb6faeecc9e1f20f..eba9ae3ba1faebd98da7d74b1dec7e36da45ed74 100644 (file)
@@ -51,6 +51,24 @@ int type;                                    /* type of initialization */
   return r;
 }
 
+/*===========================================================================*
+ *                           fill_send_mask                                 *
+ *===========================================================================*/
+PUBLIC void fill_send_mask(send_mask, set_bits)
+sys_map_t *send_mask;          /* the send mask to fill in */
+int set_bits;                  /* TRUE sets all bits, FALSE clears all bits */
+{
+/* Fill in a send mask. */
+  int i;
+
+  for (i = 0; i < NR_SYS_PROCS; i++) {
+       if (set_bits)
+               set_sys_bit(*send_mask, i);
+       else
+               unset_sys_bit(*send_mask, i);
+  }
+}
+
 /*===========================================================================*
  *                           fill_call_mask                                 *
  *===========================================================================*/