Kernel/RS: fix permission computation with 32+ system processes
This commit is contained in:
@@ -17,13 +17,13 @@
|
||||
#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 */
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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) );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:");
|
||||
|
||||
Reference in New Issue
Block a user