summaryrefslogtreecommitdiff
path: root/src/alloc.c
diff options
context:
space:
mode:
authorKim F. Storm <storm@cua.dk>2005-11-30 00:04:51 +0000
committerKim F. Storm <storm@cua.dk>2005-11-30 00:04:51 +0000
commitb57a982bbd65ba7bec3f0a0eec5b41f7c4c0107f (patch)
tree5eaa3907e05e0bbbe3cbcf1a1d4361fcf61807c0 /src/alloc.c
parentdf19bfc6cf27793910603ce3b7e652bc7d675fd4 (diff)
downloademacs-b57a982bbd65ba7bec3f0a0eec5b41f7c4c0107f.tar.gz
Include fcntl.h. Define O_WRONLY if not defined.
(valid_lisp_object_p) [!GC_MARK_STACK]: Validate pointer by passing it to `emacs_write'.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 08bba475e76..f8d2f529bae 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -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)