[patch 40/56] openmosix/mig_do_receive-size-checking.patch
Florian Delizy <[email protected]> Thu, 02 Nov 2006 22:57:04 +0100
| Newsgroups | gmane.linux.cluster.openmosix.devel |
|---|---|
| Message-ID | <[email protected]> |
[patch 40/56] openmosix/mig_do_receive-size-checking.patch mig_do_receive* sanity check and NACK returns This patch add the size checking on the mig_do_receive calls, and send NACKS to deputy if packets seems corrupted for the remote system ... Affected functions are : - mig_do_receive_mm - mig_do_receive_vma - mig_do_receive_fp - mig_do_receive_page - mig_do_receive_proc_context ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ openMosix-devel mailing list openMosix-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/openmosix-devel
mig_do_receive-size-checking.patch
(text/x-patch, 4.5 KB)
[patch @num@/@total@] @name@ mig_do_receive* sanity check and NACK returns
This patch add the size checking on the mig_do_receive calls, and send NACKS
to deputy if packets seems corrupted for the remote system ...
Affected functions are :
- mig_do_receive_mm
- mig_do_receive_vma
- mig_do_receive_fp
- mig_do_receive_page
- mig_do_receive_proc_context
Index: linux/hpc/migrecv.c
===================================================================
--- linux.orig/hpc/migrecv.c 2006-11-02 22:52:19.000000000 +0100
+++ linux/hpc/migrecv.c 2006-11-02 22:52:35.000000000 +0100
@@ -206,18 +206,28 @@
* Description:
* Receives the process mmap info.
**/
-KCOMD_NSTATIC void mig_do_receive_mm(task_t *p, struct kcom_pkt *pkt)
+KCOMD_NSTATIC int mig_do_receive_mm(task_t *p, struct kcom_pkt *pkt)
{
OMDEBUG_MIG(2, "MIG_MM\n");
+
+ if (!pkt || sizeof(struct omp_mig_mm) != pkt->len) goto error_packet;
+
down_write(&p->mm->mmap_sem);
memcpy(&p->mm->start_code, pkt->data, pkt->len);
p->mm->exec_vm=0; /* MSD debug*/
up_write(&p->mm->mmap_sem);
+
+
kcom_send_ack(p, pkt);
+ return 0;
+error_packet:
+ printk(KERN_ERR "openMosix: (mm receive) packet NULL or size mismatched\n");
+ kcom_send_nack(p, pkt);
+ return -1;
}
EXPORT_SYMBOL_GPL(mig_do_receive_mm);
@@ -235,7 +245,9 @@
struct file *file = NULL;
extern asmlinkage long sys_madvise(unsigned long, size_t, int);
+ int ret = 0;
+ if (!pkt || sizeof(struct omp_mig_vma) != pkt->len) goto error_packet;
a = (struct omp_mig_vma *)pkt->data;
@@ -268,23 +280,29 @@
flags, a->vm_pgoff);
up_write(&p->mm->mmap_sem);
- if (IS_ERR((const void *) result))
- return PTR_ERR((const void *) result);
+ if (IS_ERR((const void *) result)) {
+ ret = PTR_ERR((const void *) result);
+ goto error_packet;
+ }
if (a->vm_flags & VM_READHINTMASK) {
+
int behavior = (a->vm_flags & VM_SEQ_READ)
? MADV_RANDOM
: MADV_SEQUENTIAL;
- result=sys_madvise(a->vm_start, a->vm_size, behavior);
- if (result)
- kcom_send_nack(p, pkt);
- return result;
- }
+ ret=sys_madvise(a->vm_start, a->vm_size, behavior);
+ if (result) goto error_packet;
+
+ }
kcom_send_ack(p, pkt);
+ return ret;
- return 0;
+error_packet:
+ printk(KERN_ERR "openMosix:(vma receive) packet NULL, size mismatched, or corrupted\n");
+ kcom_send_nack(p, pkt);
+ return ret;
}
EXPORT_SYMBOL_GPL(mig_do_receive_vma);
@@ -302,7 +320,7 @@
struct mm_struct *mm = p->mm;
struct vm_area_struct *vma;
struct page *recv_page = NULL;
- unsigned long addr;
+ unsigned long addr = 0xdeadc0de;
void *kmpage;
/*
@@ -310,15 +328,15 @@
Must be done from process context.
*/
-
+ if (!pkt || PAGE_SIZE != pkt->len) goto error_packet_size;
addr=pkt->addr;
vma = find_vma(mm, addr);
if (!vma) {
OMBUG("vma not found (addr: %p)\n", (void *) addr);
- kcom_send_nack(p, pkt);
- return -1;
+ goto error_packet;
}
+
recv_page=alloc_zeroed_user_highpage(vma, addr);
kmpage=kmap(recv_page);
memcpy(kmpage, pkt->data, pkt->len);
@@ -332,13 +350,19 @@
up_write(&mm->mmap_sem);
kcom_send_ack(p, pkt);
-
return 0;
-/*out:*/
+error_packet_size:
+ printk(KERN_ERR "openMosix: (page receive) packet NULL or size mismatch\n");
+
+error_packet:
+
printk(KERN_ERR "receive page failed at addr %p\n", (void *) addr);
OMBUG("receive page failed at addr %p\n", (void *) addr);
- __free_page(recv_page);
+ if (recv_page) __free_page(recv_page);
+
+ kcom_send_nack(p, pkt);
+
return -1;
}
@@ -355,16 +379,24 @@
{
struct omp_mig_fp *fp;
+ if (!pkt || sizeof(struct omp_mig_fp) != pkt->len) goto error_packet;
+
fp=(void *)pkt->data;
OMDEBUG_MIG(2, "MIG_FP\n");
set_used_math();
+
arch_mig_receive_fp(p, fp);
kcom_send_ack(p, pkt);
return 0;
+
+error_packet:
+ printk(KERN_ERR "openMosix:(fp receive) packet NULL or size mismatched\n");
+ kcom_send_nack(p, pkt);
+ return -1;
}
/**
@@ -382,6 +414,8 @@
{
struct omp_mig_task *m;
+ if (!pkt || sizeof(struct omp_mig_task) != pkt->len) goto error_packet;
+
m=(struct omp_mig_task *)pkt->data;
OMDEBUG_MIG(1, "MIG_TASK\n");
@@ -419,6 +453,11 @@
kcom_send_ack(p, pkt);
return 0;
+
+error_packet:
+ printk(KERN_ERR "openMosix:(proc_context receive) packet NULL or size mismatched\n");
+ kcom_send_nack(p, pkt);
+ return -1;
}
/**
@@ -461,9 +500,11 @@
switch (pkt->type & MIG_MASK) {
case MIG_MM:
- mig_do_receive_mm(p, pkt);
+ ret = mig_do_receive_mm(p, pkt);
list_del(&pkt->list);
kmem_cache_free(kcom_pkt_cachep, pkt);
+ if (ret)
+ return ret;
break;
case MIG_VMA: