diff src/alloc.c @ 83405:1955a4462bf9

Merged from miles@gnu.org--gnu-2005 (patch 659-663) Patches applied: * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-659 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-660 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-661 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-662 Update from CVS * miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-663 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-445
author Karoly Lorentey <lorentey@elte.hu>
date Sat, 03 Dec 2005 14:25:50 +0000
parents 03934708f1e9 fc58516afccd
children 14a4eb789b45
line wrap: on
line diff
--- a/src/alloc.c	Wed Nov 23 01:35:21 2005 +0000
+++ b/src/alloc.c	Sat Dec 03 14:25:50 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>
@@ -4498,21 +4506,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)