Module Name: src
Committed By: christos
Date: Wed Jan 26 18:11:35 UTC 2011
Modified Files:
src/lib/libpthread: pthread_cancelstub.c
Log Message:
Moving the ssp check inside the source code does not work properly because
the compiler loses information about the size of the object. So instead of
the hacky #define mess we did before, add a way to inject our function between
the user call and the system call.
To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/lib/libpthread/pthread_cancelstub.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libpthread/pthread_cancelstub.c
diff -u src/lib/libpthread/pthread_cancelstub.c:1.29 src/lib/libpthread/pthread_cancelstub.c:1.30
--- src/lib/libpthread/pthread_cancelstub.c:1.29 Tue Jan 25 14:13:26 2011
+++ src/lib/libpthread/pthread_cancelstub.c Wed Jan 26 13:11:35 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pthread_cancelstub.c,v 1.29 2011/01/25 19:13:26 christos Exp $ */
+/* $NetBSD: pthread_cancelstub.c,v 1.30 2011/01/26 18:11:35 christos Exp $ */
/*-
* Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread_cancelstub.c,v 1.29 2011/01/25 19:13:26 christos Exp $");
+__RCSID("$NetBSD: pthread_cancelstub.c,v 1.30 2011/01/26 18:11:35 christos Exp $");
#ifndef lint
@@ -50,6 +50,8 @@
*/
#define __LIBC12_SOURCE__
+#define __ssp_weak_name(fun) _cancelstub_ ## fun
+
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/uio.h>
@@ -59,12 +61,7 @@
#include <mqueue.h>
#include <poll.h>
#include <stdarg.h>
-
-#define read _read
#include <unistd.h>
-#undef read
-ssize_t read(int, void *, size_t);
-
#include <signal.h>
#include <sys/mman.h>
@@ -473,16 +470,32 @@
return retval;
}
+#if _FORTIFY_SOURCE > 0
+#define STUB(fun) __ssp_weak_name(fun)
+ssize_t _sys_readlink(const char * __restrict, char * __restrict, size_t);
ssize_t
-read(int d, void *buf, size_t nbytes)
+_cancelstub_readlink(const char * __restrict path, char * __restrict buf,
+ size_t bufsiz)
{
- ssize_t retval;
- pthread_t self;
+ return _sys_readlink(path, buf, bufsiz);
+}
-#ifdef __ssp_check
- __ssp_check(buf, nbytes, __ssp_bos0);
+char * _sys_getcwd(char *, size_t);
+char *
+_cancelstub_getcwd(char *buf, size_t size)
+{
+ return _sys_getcwd(buf, size);
+}
+#else
+#define STUB(fun) fun
#endif
+ssize_t
+STUB(read)(int d, void *buf, size_t nbytes)
+{
+ ssize_t retval;
+ pthread_t self;
+
self = pthread__self();
TESTCANCEL(self);
retval = _sys_read(d, buf, nbytes);