diff -NurpP linux-2.6.17.3-vs2.1.1-rc25.1/include/linux/vserver/network.h linux-2.6.17.3-vs2.1.1-rc25.2/include/linux/vserver/network.h --- linux-2.6.17.3-vs2.1.1-rc25.1/include/linux/vserver/network.h 2006-06-18 05:03:05 +0200 +++ linux-2.6.17.3-vs2.1.1-rc25.2/include/linux/vserver/network.h 2006-07-08 23:27:52 +0200 @@ -13,6 +13,8 @@ /* network flags */ +#define NXF_INFO_LOCK 0x00000001 + #define NXF_STATE_SETUP (1ULL<<32) #define NXF_SC_HELPER (1ULL<<36) diff -NurpP linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/context.c linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/context.c --- linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/context.c 2006-06-18 05:03:06 +0200 +++ linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/context.c 2006-07-09 00:14:37 +0200 @@ -3,7 +3,7 @@ * * Virtual Server: Context Support * - * Copyright (C) 2003-2005 Herbert Pötzl + * Copyright (C) 2003-2006 Herbert Pötzl * * V0.01 context helper * V0.02 vx_ctx_kill syscall command @@ -577,6 +578,10 @@ int vx_migrate_user(struct task_struct * if (!p || !vxi) BUG(); + + if (vx_info_flags(vxi, VXF_INFO_LOCK, 0)) + return -EACCES; + new_user = alloc_uid(vxi->vx_id, p->uid); if (!new_user) return -ENOMEM; @@ -635,6 +640,9 @@ int vx_migrate_task(struct task_struct * if (!p || !vxi) BUG(); + if (vx_info_flags(vxi, VXF_INFO_LOCK, 0)) + return -EACCES; + old_vxi = task_get_vx_info(p); if (old_vxi == vxi) goto out; @@ -844,9 +858,10 @@ int vc_ctx_create(uint32_t xid, void __u vx_set_persistent(new_vxi); vs_state_change(new_vxi, VSC_STARTUP); - ret = new_vxi->vx_id; - vx_migrate_task(current, new_vxi); + ret = vx_migrate_task(current, new_vxi); /* if this fails, we might end up with a hashed vx_info */ + if (ret == 0) + ret = new_vxi->vx_id; put_vx_info(new_vxi); return ret; } @@ -856,6 +871,7 @@ int vc_ctx_migrate(uint32_t id, void __u { struct vcmd_ctx_migrate vc_data = { .flagword = 0 }; struct vx_info *vxi; + int ret; if (data && copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -869,13 +885,22 @@ int vc_ctx_migrate(uint32_t id, void __u vxi = lookup_vx_info(id); if (!vxi) return -ESRCH; - vx_migrate_task(current, vxi); + + ret = vx_migrate_task(current, vxi); + if (ret) + goto out_put; if (vc_data.flagword & VXM_SET_INIT) - vx_set_init(vxi, current); + ret = vx_set_init(vxi, current); + if (ret) + goto out_put; if (vc_data.flagword & VXM_SET_REAPER) - vx_set_reaper(vxi, current); + ret = vx_set_reaper(vxi, current); + if (ret) + goto out_put; + ret = 0; +out_put: put_vx_info(vxi); - return 0; + return ret; } @@ -905,6 +930,7 @@ int vc_set_cflags(uint32_t id, void __us struct vx_info *vxi; struct vcmd_ctx_flags_v0 vc_data; uint64_t mask, trigger; + int ret; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -921,8 +951,12 @@ int vc_set_cflags(uint32_t id, void __us if (trigger & VXF_STATE_SETUP) vx_mask_cap_bset(vxi, current); if (trigger & VXF_STATE_INIT) { - vx_set_init(vxi, current); - vx_set_reaper(vxi, current); + ret = vx_set_init(vxi, current); + if (!ret) + goto out_put; + ret = vx_set_reaper(vxi, current); + if (!ret) + goto out_put; } } @@ -930,9 +964,10 @@ int vc_set_cflags(uint32_t id, void __us vc_data.flagword, mask); if (trigger & VXF_PERSISTENT) vx_set_persistent(vxi); - + ret = 0; +out_put: put_vx_info(vxi); - return 0; + return ret; } static int do_get_caps(xid_t xid, uint64_t *bcaps, uint64_t *ccaps) diff -NurpP linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/namespace.c linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/namespace.c --- linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/namespace.c 2006-06-18 05:03:06 +0200 +++ linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/namespace.c 2006-07-08 23:39:25 +0200 @@ -3,7 +3,7 @@ * * Virtual Server: Context Namespace Support * - * Copyright (C) 2003-2005 Herbert Pötzl + * Copyright (C) 2003-2006 Herbert Pötzl * * V0.01 broken out from context.c 0.07 * V0.02 added task locking for namespace @@ -61,6 +62,10 @@ int vc_enter_namespace(uint32_t id, void if (!vxi->vx_namespace) goto out_put; + ret = -EACCES; + if (vx_info_flags(vxi, VXF_INFO_LOCK, 0)) + goto out_put; + ret = -ENOMEM; fs = copy_fs_struct(vxi->vx_fs); if (!fs) diff -NurpP linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/network.c linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/network.c --- linux-2.6.17.3-vs2.1.1-rc25.1/kernel/vserver/network.c 2006-06-18 16:42:38 +0200 +++ linux-2.6.17.3-vs2.1.1-rc25.2/kernel/vserver/network.c 2006-07-09 00:28:05 +0200 @@ -3,7 +3,7 @@ * * Virtual Server: Network Support * - * Copyright (C) 2003-2005 Herbert Pötzl + * Copyright (C) 2003-2006 Herbert Pötzl * * V0.01 broken out from vcontext V0.05 * V0.02 cleaned up implementation @@ -604,13 +605,21 @@ int vc_net_create(uint32_t nid, void __u int vc_net_migrate(uint32_t id, void __user *data) { struct nx_info *nxi; + int ret; nxi = lookup_nx_info(id); if (!nxi) return -ESRCH; + + ret = -EPERM; + if (nx_info_flags(nxi, NXF_INFO_LOCK, 0)) + goto out_put; + nx_migrate_task(current, nxi); + ret = 0; +out_put: put_nx_info(nxi); - return 0; + return ret; } int vc_net_add(uint32_t nid, void __user *data)