Mercurial > emacs
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)