From 237277e9a8133c64026b736b1427141e71655330 Mon Sep 17 00:00:00 2001 From: "Peter S. Mazinger" Date: Thu, 27 Oct 2005 22:58:52 +0000 Subject: Moved guard_setup to dl-osinfo.h (used commonly by ldso and libc). Renamed to _dl_setup_stack_chk_guard, as in glibc. SSP requires now binutils-2.16.1 and newer. Add NOT_IN_libc/IS_IN_libc. Began using -DSHARED in uClibc_main.c, there are more candidates in there. Move back dl_protect_relro to it's earlier place. --- libc/sysdeps/linux/common/dl-osinfo.h | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 libc/sysdeps/linux/common/dl-osinfo.h (limited to 'libc/sysdeps/linux/common/dl-osinfo.h') diff --git a/libc/sysdeps/linux/common/dl-osinfo.h b/libc/sysdeps/linux/common/dl-osinfo.h new file mode 100644 index 000000000..ee3e2ce99 --- /dev/null +++ b/libc/sysdeps/linux/common/dl-osinfo.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2000-2005 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#ifndef _DL_OSINFO_H +#define _DL_OSINFO_H 1 + +#include + +#ifdef __UCLIBC_HAS_SSP__ +#include +#include + +#ifdef IS_IN_libc +#include +#if 0 +#ifndef __SSP_QUICK_CANARY__ +#define OPEN __libc_open +#define READ __libc_read +#define CLOSE __libc_close +#endif +#define GETTIMEOFDAY gettimeofday +#endif +#else +#ifndef __SSP_QUICK_CANARY__ +#define OPEN _dl_open +#define READ _dl_read +#define CLOSE _dl_close +#endif +#define GETTIMEOFDAY _dl_gettimeofday +#endif + +static __always_inline uintptr_t _dl_setup_stack_chk_guard(void) +{ + uintptr_t ret; +#ifndef __SSP_QUICK_CANARY__ + { + int fd = OPEN("/dev/urandom", O_RDONLY, 0); + if (fd >= 0) { + size_t size = READ(fd, &ret, sizeof(ret)); + CLOSE(fd); + if (size == (size_t) sizeof(ret)) + return ret; + } + } +#endif /* !__SSP_QUICK_CANARY__ */ + + /* Start with the "terminator canary". */ + ret = 0xFF0A0D00UL; + + /* Everything failed? Or we are using a weakened model of the + * terminator canary */ + { + struct timeval tv; + if (GETTIMEOFDAY(&tv, NULL) != (-1)) + ret ^= tv.tv_usec ^ tv.tv_sec; + } + return ret; +} +#endif /* __UCLIBC_HAS_SSP__ */ + +#endif /* _DL_OSINFO_H */ -- cgit v1.2.3