changeset 67216:fc58516afccd

Include fcntl.h. Define O_WRONLY if not defined. (valid_lisp_object_p) [!GC_MARK_STACK]: Validate pointer by passing it to `emacs_write'.
author Kim F. Storm <storm@cua.dk>
date Wed, 30 Nov 2005 00:04:51 +0000
parents c84d59e9c018
children 1731ed7a115f
files src/alloc.c
diffstat 1 files changed, 28 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/alloc.c	Wed Nov 30 00:04:34 2005 +0000
+++ b/src/alloc.c	Wed Nov 30 00:04:51 2005 +0000
@@ -66,6 +66,14 @@
 extern POINTER_TYPE *sbrk ();
 #endif
 
+#ifdef HAVE_FCNTL_H
+#define INCLUDED_FCNTL
+#include <fcntl.h>
+#endif
+#ifndef O_WRONLY
+#define O_WRONLY 1
+#endif
+
 #ifdef DOUG_LEA_MALLOC
 
 #include <malloc.h>
@@ -4497,21 +4505,37 @@
 valid_lisp_object_p (obj)
      Lisp_Object obj;
 {
+  void *p;
 #if !GC_MARK_STACK
-  /* Cannot determine this.  */
-  return -1;
+  int fd;
 #else
-  void *p;
   struct mem_node *m;
+#endif
 
   if (INTEGERP (obj))
     return 1;
 
   p = (void *) XPNTR (obj);
-
   if (PURE_POINTER_P (p))
     return 1;
 
+#if !GC_MARK_STACK
+  /* We need to determine whether it is safe to access memory at
+     address P.  Obviously, we cannot just access it (we would SEGV
+     trying), so we trick the o/s to tell us whether p is a valid
+     pointer.  Unfortunately, we cannot use NULL_DEVICE here, as
+     emacs_write may not validate p in that case.  */
+  if ((fd = emacs_open("__Valid__Lisp__Object__", O_CREAT | O_WRONLY | O_TRUNC, 0666)) >= 0)
+    {
+      int valid = emacs_write(fd, (char *)p, 16) == 16;
+      emacs_close(fd);
+      unlink("__Valid__Lisp__Object__");
+      return valid;
+    }
+
+    return -1;
+#else
+
   m = mem_find (p);
 
   if (m == MEM_NIL)