]> git.eshelyaron.com Git - emacs.git/commitdiff
Include fcntl.h. Define O_WRONLY if not defined.
authorKim F. Storm <storm@cua.dk>
Wed, 30 Nov 2005 00:04:51 +0000 (00:04 +0000)
committerKim F. Storm <storm@cua.dk>
Wed, 30 Nov 2005 00:04:51 +0000 (00:04 +0000)
(valid_lisp_object_p) [!GC_MARK_STACK]: Validate pointer by
passing it to `emacs_write'.

src/alloc.c

index 08bba475e767f5947e192c6ef33ec8d473740687..f8d2f529bae9554a1cf4d34fb6798452c8964ee7 100644 (file)
@@ -66,6 +66,14 @@ Boston, MA 02110-1301, USA.  */
 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 @@ int
 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)