[Xenomai-git] Philippe Gerum : skins: sanitize heap binding

2010-06-19 Thread GIT version control
Module: xenomai-head
Branch: master
Commit: bcd7078ddc7ac3ece81bf45279912691932b7205
URL:
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205

Author: Philippe Gerum r...@xenomai.org
Date:   Sun Jun 13 17:27:06 2010 +0200

skins: sanitize heap binding

---

 include/nucleus/heap.h  |5 +++
 ksrc/nucleus/shadow.c   |   16 +++--
 src/skins/common/sem_heap.c |   76 +++
 src/skins/native/heap.c |   38 -
 src/skins/native/queue.c|   38 -
 src/skins/psos+/rn.c|   36 +++-
 src/skins/rtai/shm.c|   61 +++---
 src/skins/vrtx/heap.c   |   36 +++-
 src/skins/vrtx/pt.c |   36 +++-
 9 files changed, 90 insertions(+), 252 deletions(-)

diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index fecdb79..f4ebe11 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap,
 
 #define XNHEAP_DEV_NAME  /dev/rtheap
 
+struct xnheap_desc {
+   unsigned long handle;
+   unsigned int size;
+};
+
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 1a32527..cc313cf 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void)
 {
nkvdso = (struct xnvdso *)
xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso));
-
-   if (!nkvdso)
+   if (nkvdso == NULL)
xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n);
 
nkvdso-features = XNVDSO_FEATURES;
@@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
return err;
 }
 
-struct heap_info {
-   xnheap_t *addr;
-   unsigned size;
-};
-
 static int xnshadow_sys_sem_heap(struct pt_regs *regs)
 {
-   struct heap_info hinfo, __user *us_hinfo;
+   struct xnheap_desc hinfo, __user *us_hinfo;
unsigned global;
 
global = __xn_reg_arg2(regs);
-   us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs);
-   hinfo.addr = xnsys_ppd_get(global)-sem_heap;
-   hinfo.size = xnheap_extentsize(hinfo.addr);
+   us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs);
+   hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap;
+   hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap);
 
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index bf7031d..acb655b 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -11,62 +11,68 @@
 #include sys/mman.h
 
 #include nucleus/vdso.h
+#include nucleus/heap.h
 #include asm/xenomai/syscall.h
 #include asm-generic/bits/current.h
-
 #include sem_heap.h
 
 unsigned long xeno_sem_heap[2] = { 0, 0 };
+
 struct xnvdso *nkvdso;
 
-static void *map_sem_heap(unsigned shared)
+void *xeno_map_heap(unsigned long handle, unsigned int size)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int fd, err;
+   int fd, ret;
+   void *addr;
 
-   fd = open(/dev/rtheap, O_RDWR, 0);
+   fd = open(XNHEAP_DEV_NAME, O_RDWR, 0);
if (fd  0) {
-   fprintf(stderr, Xenomai: open: %m\n);
+   perror(Xenomai: open);
return MAP_FAILED;
}
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = ioctl(fd, 0, handle);
+   if (ret) {
+   perror(Xenomai: ioctl);
return MAP_FAILED;
}
 
-   err = ioctl(fd, 0, hinfo.addr);
-   if (err  0) {
-   fprintf(stderr, Xenomai: ioctl: %m\n);
-   return MAP_FAILED;
-   }
+   addr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+   MAP_SHARED, fd, 0L);
 
-   hinfo.addr = mmap(NULL, hinfo.size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
 
-   return hinfo.addr;
+   return addr;
 }
 
-static void unmap_sem_heap(unsigned long heap_addr, unsigned shared)
+static void *map_sem_heap(unsigned int shared)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int err;
+   struct xnheap_desc hinfo;
+   int ret;
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
+   if (ret  0) {
+   errno = -ret;
+   perror(Xenomai: sys_sem_heap);
+   return MAP_FAILED;
+   }
+
+   return xeno_map_heap(hinfo.handle, 

[Xenomai-git] Philippe Gerum : skins: sanitize heap binding

2010-06-18 Thread GIT version control
Module: xenomai-2.5
Branch: master
Commit: bcd7078ddc7ac3ece81bf45279912691932b7205
URL:
http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205

Author: Philippe Gerum r...@xenomai.org
Date:   Sun Jun 13 17:27:06 2010 +0200

skins: sanitize heap binding

---

 include/nucleus/heap.h  |5 +++
 ksrc/nucleus/shadow.c   |   16 +++--
 src/skins/common/sem_heap.c |   76 +++
 src/skins/native/heap.c |   38 -
 src/skins/native/queue.c|   38 -
 src/skins/psos+/rn.c|   36 +++-
 src/skins/rtai/shm.c|   61 +++---
 src/skins/vrtx/heap.c   |   36 +++-
 src/skins/vrtx/pt.c |   36 +++-
 9 files changed, 90 insertions(+), 252 deletions(-)

diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index fecdb79..f4ebe11 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap,
 
 #define XNHEAP_DEV_NAME  /dev/rtheap
 
+struct xnheap_desc {
+   unsigned long handle;
+   unsigned int size;
+};
+
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 1a32527..cc313cf 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void)
 {
nkvdso = (struct xnvdso *)
xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso));
-
-   if (!nkvdso)
+   if (nkvdso == NULL)
xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n);
 
nkvdso-features = XNVDSO_FEATURES;
@@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
return err;
 }
 
-struct heap_info {
-   xnheap_t *addr;
-   unsigned size;
-};
-
 static int xnshadow_sys_sem_heap(struct pt_regs *regs)
 {
-   struct heap_info hinfo, __user *us_hinfo;
+   struct xnheap_desc hinfo, __user *us_hinfo;
unsigned global;
 
global = __xn_reg_arg2(regs);
-   us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs);
-   hinfo.addr = xnsys_ppd_get(global)-sem_heap;
-   hinfo.size = xnheap_extentsize(hinfo.addr);
+   us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs);
+   hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap;
+   hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap);
 
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index bf7031d..acb655b 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -11,62 +11,68 @@
 #include sys/mman.h
 
 #include nucleus/vdso.h
+#include nucleus/heap.h
 #include asm/xenomai/syscall.h
 #include asm-generic/bits/current.h
-
 #include sem_heap.h
 
 unsigned long xeno_sem_heap[2] = { 0, 0 };
+
 struct xnvdso *nkvdso;
 
-static void *map_sem_heap(unsigned shared)
+void *xeno_map_heap(unsigned long handle, unsigned int size)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int fd, err;
+   int fd, ret;
+   void *addr;
 
-   fd = open(/dev/rtheap, O_RDWR, 0);
+   fd = open(XNHEAP_DEV_NAME, O_RDWR, 0);
if (fd  0) {
-   fprintf(stderr, Xenomai: open: %m\n);
+   perror(Xenomai: open);
return MAP_FAILED;
}
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = ioctl(fd, 0, handle);
+   if (ret) {
+   perror(Xenomai: ioctl);
return MAP_FAILED;
}
 
-   err = ioctl(fd, 0, hinfo.addr);
-   if (err  0) {
-   fprintf(stderr, Xenomai: ioctl: %m\n);
-   return MAP_FAILED;
-   }
+   addr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+   MAP_SHARED, fd, 0L);
 
-   hinfo.addr = mmap(NULL, hinfo.size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
 
-   return hinfo.addr;
+   return addr;
 }
 
-static void unmap_sem_heap(unsigned long heap_addr, unsigned shared)
+static void *map_sem_heap(unsigned int shared)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int err;
+   struct xnheap_desc hinfo;
+   int ret;
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
+   if (ret  0) {
+   errno = -ret;
+   perror(Xenomai: sys_sem_heap);
+   return MAP_FAILED;
+   }
+
+   return xeno_map_heap(hinfo.handle, 

[Xenomai-git] Philippe Gerum : skins: sanitize heap binding

2010-06-17 Thread GIT version control
Module: xenomai-rpm
Branch: queue/vfile
Commit: bcd7078ddc7ac3ece81bf45279912691932b7205
URL:
http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205

Author: Philippe Gerum r...@xenomai.org
Date:   Sun Jun 13 17:27:06 2010 +0200

skins: sanitize heap binding

---

 include/nucleus/heap.h  |5 +++
 ksrc/nucleus/shadow.c   |   16 +++--
 src/skins/common/sem_heap.c |   76 +++
 src/skins/native/heap.c |   38 -
 src/skins/native/queue.c|   38 -
 src/skins/psos+/rn.c|   36 +++-
 src/skins/rtai/shm.c|   61 +++---
 src/skins/vrtx/heap.c   |   36 +++-
 src/skins/vrtx/pt.c |   36 +++-
 9 files changed, 90 insertions(+), 252 deletions(-)

diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index fecdb79..f4ebe11 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap,
 
 #define XNHEAP_DEV_NAME  /dev/rtheap
 
+struct xnheap_desc {
+   unsigned long handle;
+   unsigned int size;
+};
+
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 1a32527..cc313cf 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void)
 {
nkvdso = (struct xnvdso *)
xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso));
-
-   if (!nkvdso)
+   if (nkvdso == NULL)
xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n);
 
nkvdso-features = XNVDSO_FEATURES;
@@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
return err;
 }
 
-struct heap_info {
-   xnheap_t *addr;
-   unsigned size;
-};
-
 static int xnshadow_sys_sem_heap(struct pt_regs *regs)
 {
-   struct heap_info hinfo, __user *us_hinfo;
+   struct xnheap_desc hinfo, __user *us_hinfo;
unsigned global;
 
global = __xn_reg_arg2(regs);
-   us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs);
-   hinfo.addr = xnsys_ppd_get(global)-sem_heap;
-   hinfo.size = xnheap_extentsize(hinfo.addr);
+   us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs);
+   hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap;
+   hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap);
 
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index bf7031d..acb655b 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -11,62 +11,68 @@
 #include sys/mman.h
 
 #include nucleus/vdso.h
+#include nucleus/heap.h
 #include asm/xenomai/syscall.h
 #include asm-generic/bits/current.h
-
 #include sem_heap.h
 
 unsigned long xeno_sem_heap[2] = { 0, 0 };
+
 struct xnvdso *nkvdso;
 
-static void *map_sem_heap(unsigned shared)
+void *xeno_map_heap(unsigned long handle, unsigned int size)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int fd, err;
+   int fd, ret;
+   void *addr;
 
-   fd = open(/dev/rtheap, O_RDWR, 0);
+   fd = open(XNHEAP_DEV_NAME, O_RDWR, 0);
if (fd  0) {
-   fprintf(stderr, Xenomai: open: %m\n);
+   perror(Xenomai: open);
return MAP_FAILED;
}
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = ioctl(fd, 0, handle);
+   if (ret) {
+   perror(Xenomai: ioctl);
return MAP_FAILED;
}
 
-   err = ioctl(fd, 0, hinfo.addr);
-   if (err  0) {
-   fprintf(stderr, Xenomai: ioctl: %m\n);
-   return MAP_FAILED;
-   }
+   addr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+   MAP_SHARED, fd, 0L);
 
-   hinfo.addr = mmap(NULL, hinfo.size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
 
-   return hinfo.addr;
+   return addr;
 }
 
-static void unmap_sem_heap(unsigned long heap_addr, unsigned shared)
+static void *map_sem_heap(unsigned int shared)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int err;
+   struct xnheap_desc hinfo;
+   int ret;
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
+   if (ret  0) {
+   errno = -ret;
+   perror(Xenomai: sys_sem_heap);
+   return MAP_FAILED;
+   }
+
+   return 

[Xenomai-git] Philippe Gerum : skins: sanitize heap binding

2010-06-15 Thread GIT version control
Module: xenomai-rpm
Branch: for-upstream
Commit: bcd7078ddc7ac3ece81bf45279912691932b7205
URL:
http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205

Author: Philippe Gerum r...@xenomai.org
Date:   Sun Jun 13 17:27:06 2010 +0200

skins: sanitize heap binding

---

 include/nucleus/heap.h  |5 +++
 ksrc/nucleus/shadow.c   |   16 +++--
 src/skins/common/sem_heap.c |   76 +++
 src/skins/native/heap.c |   38 -
 src/skins/native/queue.c|   38 -
 src/skins/psos+/rn.c|   36 +++-
 src/skins/rtai/shm.c|   61 +++---
 src/skins/vrtx/heap.c   |   36 +++-
 src/skins/vrtx/pt.c |   36 +++-
 9 files changed, 90 insertions(+), 252 deletions(-)

diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index fecdb79..f4ebe11 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap,
 
 #define XNHEAP_DEV_NAME  /dev/rtheap
 
+struct xnheap_desc {
+   unsigned long handle;
+   unsigned int size;
+};
+
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 1a32527..cc313cf 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void)
 {
nkvdso = (struct xnvdso *)
xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso));
-
-   if (!nkvdso)
+   if (nkvdso == NULL)
xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n);
 
nkvdso-features = XNVDSO_FEATURES;
@@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
return err;
 }
 
-struct heap_info {
-   xnheap_t *addr;
-   unsigned size;
-};
-
 static int xnshadow_sys_sem_heap(struct pt_regs *regs)
 {
-   struct heap_info hinfo, __user *us_hinfo;
+   struct xnheap_desc hinfo, __user *us_hinfo;
unsigned global;
 
global = __xn_reg_arg2(regs);
-   us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs);
-   hinfo.addr = xnsys_ppd_get(global)-sem_heap;
-   hinfo.size = xnheap_extentsize(hinfo.addr);
+   us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs);
+   hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap;
+   hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap);
 
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index bf7031d..acb655b 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -11,62 +11,68 @@
 #include sys/mman.h
 
 #include nucleus/vdso.h
+#include nucleus/heap.h
 #include asm/xenomai/syscall.h
 #include asm-generic/bits/current.h
-
 #include sem_heap.h
 
 unsigned long xeno_sem_heap[2] = { 0, 0 };
+
 struct xnvdso *nkvdso;
 
-static void *map_sem_heap(unsigned shared)
+void *xeno_map_heap(unsigned long handle, unsigned int size)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int fd, err;
+   int fd, ret;
+   void *addr;
 
-   fd = open(/dev/rtheap, O_RDWR, 0);
+   fd = open(XNHEAP_DEV_NAME, O_RDWR, 0);
if (fd  0) {
-   fprintf(stderr, Xenomai: open: %m\n);
+   perror(Xenomai: open);
return MAP_FAILED;
}
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = ioctl(fd, 0, handle);
+   if (ret) {
+   perror(Xenomai: ioctl);
return MAP_FAILED;
}
 
-   err = ioctl(fd, 0, hinfo.addr);
-   if (err  0) {
-   fprintf(stderr, Xenomai: ioctl: %m\n);
-   return MAP_FAILED;
-   }
+   addr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+   MAP_SHARED, fd, 0L);
 
-   hinfo.addr = mmap(NULL, hinfo.size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
 
-   return hinfo.addr;
+   return addr;
 }
 
-static void unmap_sem_heap(unsigned long heap_addr, unsigned shared)
+static void *map_sem_heap(unsigned int shared)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int err;
+   struct xnheap_desc hinfo;
+   int ret;
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
+   if (ret  0) {
+   errno = -ret;
+   perror(Xenomai: sys_sem_heap);
+   return MAP_FAILED;
+   }
+
+   return 

[Xenomai-git] Philippe Gerum : skins: sanitize heap binding

2010-06-15 Thread GIT version control
Module: xenomai-rpm
Branch: queue/mayday
Commit: bcd7078ddc7ac3ece81bf45279912691932b7205
URL:
http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=bcd7078ddc7ac3ece81bf45279912691932b7205

Author: Philippe Gerum r...@xenomai.org
Date:   Sun Jun 13 17:27:06 2010 +0200

skins: sanitize heap binding

---

 include/nucleus/heap.h  |5 +++
 ksrc/nucleus/shadow.c   |   16 +++--
 src/skins/common/sem_heap.c |   76 +++
 src/skins/native/heap.c |   38 -
 src/skins/native/queue.c|   38 -
 src/skins/psos+/rn.c|   36 +++-
 src/skins/rtai/shm.c|   61 +++---
 src/skins/vrtx/heap.c   |   36 +++-
 src/skins/vrtx/pt.c |   36 +++-
 9 files changed, 90 insertions(+), 252 deletions(-)

diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index fecdb79..f4ebe11 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -279,4 +279,9 @@ int xnheap_check_block(xnheap_t *heap,
 
 #define XNHEAP_DEV_NAME  /dev/rtheap
 
+struct xnheap_desc {
+   unsigned long handle;
+   unsigned int size;
+};
+
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index 1a32527..cc313cf 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -702,8 +702,7 @@ void __init xnheap_init_vdso(void)
 {
nkvdso = (struct xnvdso *)
xnheap_alloc(__xnsys_global_ppd.sem_heap, sizeof(*nkvdso));
-
-   if (!nkvdso)
+   if (nkvdso == NULL)
xnpod_fatal(Xenomai: cannot allocate memory for xnvdso!\n);
 
nkvdso-features = XNVDSO_FEATURES;
@@ -1891,20 +1890,15 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
return err;
 }
 
-struct heap_info {
-   xnheap_t *addr;
-   unsigned size;
-};
-
 static int xnshadow_sys_sem_heap(struct pt_regs *regs)
 {
-   struct heap_info hinfo, __user *us_hinfo;
+   struct xnheap_desc hinfo, __user *us_hinfo;
unsigned global;
 
global = __xn_reg_arg2(regs);
-   us_hinfo = (struct heap_info __user *) __xn_reg_arg1(regs);
-   hinfo.addr = xnsys_ppd_get(global)-sem_heap;
-   hinfo.size = xnheap_extentsize(hinfo.addr);
+   us_hinfo = (struct xnheap_desc __user *) __xn_reg_arg1(regs);
+   hinfo.handle = (unsigned long)xnsys_ppd_get(global)-sem_heap;
+   hinfo.size = xnheap_extentsize(xnsys_ppd_get(global)-sem_heap);
 
return __xn_safe_copy_to_user(us_hinfo, hinfo, sizeof(*us_hinfo));
 }
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index bf7031d..acb655b 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -11,62 +11,68 @@
 #include sys/mman.h
 
 #include nucleus/vdso.h
+#include nucleus/heap.h
 #include asm/xenomai/syscall.h
 #include asm-generic/bits/current.h
-
 #include sem_heap.h
 
 unsigned long xeno_sem_heap[2] = { 0, 0 };
+
 struct xnvdso *nkvdso;
 
-static void *map_sem_heap(unsigned shared)
+void *xeno_map_heap(unsigned long handle, unsigned int size)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int fd, err;
+   int fd, ret;
+   void *addr;
 
-   fd = open(/dev/rtheap, O_RDWR, 0);
+   fd = open(XNHEAP_DEV_NAME, O_RDWR, 0);
if (fd  0) {
-   fprintf(stderr, Xenomai: open: %m\n);
+   perror(Xenomai: open);
return MAP_FAILED;
}
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = ioctl(fd, 0, handle);
+   if (ret) {
+   perror(Xenomai: ioctl);
return MAP_FAILED;
}
 
-   err = ioctl(fd, 0, hinfo.addr);
-   if (err  0) {
-   fprintf(stderr, Xenomai: ioctl: %m\n);
-   return MAP_FAILED;
-   }
+   addr = mmap(NULL, size, PROT_READ|PROT_WRITE,
+   MAP_SHARED, fd, 0L);
 
-   hinfo.addr = mmap(NULL, hinfo.size,
- PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
 
-   return hinfo.addr;
+   return addr;
 }
 
-static void unmap_sem_heap(unsigned long heap_addr, unsigned shared)
+static void *map_sem_heap(unsigned int shared)
 {
-   struct heap_info {
-   void *addr;
-   unsigned size;
-   } hinfo;
-   int err;
+   struct xnheap_desc hinfo;
+   int ret;
 
-   err = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
-   if (err  0) {
-   fprintf(stderr, Xenomai: sys_sem_heap: %m\n);
+   ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hinfo, shared);
+   if (ret  0) {
+   errno = -ret;
+   perror(Xenomai: sys_sem_heap);
+   return MAP_FAILED;
+   }
+
+   return