Now that we have sendsyslog(2), we can directly use it in the
authorderaadt <deraadt@openbsd.org>
Mon, 14 Jul 2014 03:54:50 +0000 (03:54 +0000)
committerderaadt <deraadt@openbsd.org>
Mon, 14 Jul 2014 03:54:50 +0000 (03:54 +0000)
(previously completely retarded) stack_smash_handler of ld.so
ok beck miod tedu

23 files changed:
libexec/ld.so/alpha/ldasm.S
libexec/ld.so/alpha/syscall.h
libexec/ld.so/amd64/ldasm.S
libexec/ld.so/amd64/syscall.h
libexec/ld.so/arm/ldasm.S
libexec/ld.so/arm/syscall.h
libexec/ld.so/hppa/ldasm.S
libexec/ld.so/hppa/syscall.h
libexec/ld.so/i386/ldasm.S
libexec/ld.so/i386/syscall.h
libexec/ld.so/m88k/ldasm.S
libexec/ld.so/m88k/syscall.h
libexec/ld.so/mips64/ldasm.S
libexec/ld.so/mips64/syscall.h
libexec/ld.so/powerpc/ldasm.S
libexec/ld.so/powerpc/syscall.h
libexec/ld.so/sh/ldasm.S
libexec/ld.so/sh/syscall.h
libexec/ld.so/sparc/ldasm.S
libexec/ld.so/sparc/syscall.h
libexec/ld.so/sparc64/ldasm.S
libexec/ld.so/sparc64/syscall.h
libexec/ld.so/util.c

index b419066..927b79a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.26 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.27 2014/07/14 03:54:50 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -256,6 +256,7 @@ DL_SYSCALL(fstat)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(getdents)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL(gettimeofday)
 DL_SYSCALL_NOERR(issetugid)
 DL_SYSCALL(lstat)
index 4edf378..b9c8927 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.26 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.27 2014/07/14 03:54:50 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -41,7 +41,6 @@
 int    _dl_close(int);
 __dead
 int    _dl_exit(int);
-int    _dl_getentropy(char *, size_t);
 int    _dl_issetugid(void);
 void * _dl_mmap(void *, size_t, int, int, int, off_t);
 int    _dl_mprotect(const void *, size_t, int);
@@ -58,6 +57,8 @@ int   _dl_readlink(const char *, char *, size_t);
 int    _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
+int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index f3bf536..969e1a0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.17 2014/07/09 12:51:20 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.18 2014/07/14 03:54:50 deraadt Exp $      */
 
 /*
  * Copyright (c) 2002,2004 Dale Rahn
@@ -96,6 +96,7 @@ DL_SYSCALL(readlink)
 DL_SYSCALL(lstat)
 DL_SYSCALL(utrace)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL2(set_tcb,__set_tcb)
 DL_SYSCALL2(_syscall,__syscall)
index 71967e1..91aa7ce 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.14 2014/07/09 12:51:20 guenther Exp $   */
+/*     $OpenBSD: syscall.h,v 1.15 2014/07/14 03:54:50 deraadt Exp $    */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 6752646..8ec28ce 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.15 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.16 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2004 Dale Rahn
@@ -125,6 +125,7 @@ DL_SYSCALL(readlink)
 DL_SYSCALL(lstat)
 DL_SYSCALL(utrace)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL2(sysctl,__sysctl)
 
index 0fe68d6..2b56307 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.14 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.15 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 136b448..868ab87 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.14 2014/07/09 12:51:20 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.15 2014/07/14 03:54:51 deraadt Exp $      */
 
 /*
  * Copyright (c) 2004 Michael Shalayeff
@@ -272,6 +272,12 @@ ENTRY(_dl_getentropy,0)
        nop
 EXIT(_dl_getentropy)
 
+ENTRY(_dl_sendsyslog,0)
+       SYSCALL(sendsyslog)
+       bv      r0(rp)
+       nop
+EXIT(_dl_sendsyslog)
+
 ENTRY(_dl_sigprocmask,0)
        stw     arg2, HPPA_FRAME_ARG(2)(sp)
 
index 71967e1..da98544 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.14 2014/07/09 12:51:20 guenther Exp $   */
+/*     $OpenBSD: syscall.h,v 1.15 2014/07/14 03:54:51 deraadt Exp $    */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index bbcef53..7750a8f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.18 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.19 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2002 Dale Rahn
@@ -121,6 +121,7 @@ DL_SYSCALL(readlink)
 DL_SYSCALL(lstat)
 DL_SYSCALL(utrace)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL2(sysctl,__sysctl)
 DL_SYSCALL(getdents)
index 40b7151..4653e47 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.18 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.19 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 2d6c509..e392d40 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.12 2014/07/10 07:41:26 miod Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.13 2014/07/14 03:54:51 deraadt Exp $      */
 
 /*
  * Copyright (c) 2013 Miodrag Vallat.
@@ -209,6 +209,9 @@ DL_SYSCALL(utrace)
 DL_SYSCALL(getentropy)
        jmp     %r1
 
+DL_SYSCALL(sendsyslog)
+       jmp     %r1
+
 DL_SYSCALL2(getcwd,__getcwd)
        jmp     %r1
 
index 9d60ba3..08263da 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.10 2014/07/09 12:51:20 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.11 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index b9e79b9..5b5bb8f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.12 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.13 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 1998-2002 Opsycon AB, Sweden.
@@ -170,6 +170,7 @@ DL_SYSCALL(fstat)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(getdents)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL(gettimeofday)
 DL_SYSCALL_NOERR(issetugid)
 DL_SYSCALL(lstat)
index 1e81704..ed86688 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.16 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.17 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 1998-2002 Opsycon AB, Sweden.
@@ -44,7 +44,6 @@ int   _dl_exit(int);
 int    _dl_fstat(int, struct stat *);
 int    _dl_getcwd(char *, size_t);
 ssize_t        _dl_getdents(int, char *, size_t);
-int    _dl_getentropy(char *, size_t);
 int    _dl_gettimeofday(struct timeval *, struct timezone *);
 int    _dl_issetugid(void);
 int    _dl_lstat(const char *, struct stat *);
@@ -57,6 +56,8 @@ int   _dl_sigprocmask(int, const sigset_t *, sigset_t *);
 long   _dl__syscall(quad_t, ...);
 int    _dl_sysctl(const int *, u_int, void *, size_t *, void *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
+int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fd, off_t offset, int whence)
index e61840f..478c1d9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.20 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.21 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 1999 Dale Rahn
@@ -209,6 +209,7 @@ DL_SYSCALL(fstat)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL(getdents)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL(gettimeofday)
 DL_SYSCALL_NOERR(issetugid)
 DL_SYSCALL(lstat)
index bb3db95..15c4239 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.34 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.35 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -46,7 +46,6 @@ void  _dl_exit(int);
 int    _dl_fstat(int, struct stat *);
 int    _dl_getcwd(char *, size_t);
 ssize_t        _dl_getdents(int, char *, size_t);
-int    _dl_getentropy(char *, size_t);
 int    _dl_gettimeofday(struct timeval *, struct timezone *);
 int    _dl_issetugid(void);
 int    _dl_lstat(const char *, struct stat *);
@@ -61,6 +60,8 @@ long  _dl__syscall(quad_t, ...);
 int    _dl_sysctl(const int *, u_int, void *, size_t *, void *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 ssize_t        _dl_write(int, const char *, size_t);
+int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 37e4225..fed5cab 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.16 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: ldasm.S,v 1.17 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2006 Dale Rahn
@@ -208,6 +208,7 @@ DL_SYSCALL(readlink)
 DL_SYSCALL(lstat)
 DL_SYSCALL(utrace)
 DL_SYSCALL(getentropy)
+DL_SYSCALL(sendsyslog)
 DL_SYSCALL2(getcwd,__getcwd)
 DL_SYSCALL2(sysctl,__sysctl)
 
index 27c3fa2..2cc9fa1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.12 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.13 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 291fd3c..c989d07 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.24 2014/07/09 12:51:21 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.25 2014/07/14 03:54:51 deraadt Exp $      */
 
 /*
  * Copyright (c) 2001 Jason L. Wright (jason@thought.net)
@@ -371,6 +371,17 @@ _dl_getentropy:
        retl
         sub %g0, %o0, %o0                      ! error: result = -errno
 
+       .section ".text"
+       .align 4
+       .global _dl_sendsyslog
+       .type _dl_sendsyslog,@function
+_dl_sendsyslog:
+       mov SYS_sendsyslog | SYSCALL_G2RFLAG, %g1       ! calling sys_sendsyslog
+       add %o7, 8, %g2                         ! just return on success
+       t ST_SYSCALL                            ! off to wonderland
+       retl
+        sub %g0, %o0, %o0                      ! error: result = -errno
+
 /*
  * V8 sparc .{,u}{mul,div,rem} replacements.
  * We try to mimic them 100%.  Full 64 bit sources or outputs, and
index a07aa2b..fefe021 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.19 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.20 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 3ade982..a49bd75 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ldasm.S,v 1.36 2014/07/09 12:51:21 guenther Exp $     */
+/*     $OpenBSD: ldasm.S,v 1.37 2014/07/14 03:54:51 deraadt Exp $      */
 /*     $NetBSD: rtld_start.S,v 1.5 2001/08/14 22:17:48 eeh Exp $       */
 
 /*
@@ -347,3 +347,10 @@ _ENTRY(_dl_getentropy)
        t ST_SYSCALL                            ! off to wonderland
        retl
         sub %g0, %o0, %o0                      ! error: result = -errno
+
+_ENTRY(_dl_sendsyslog)
+       mov SYS_sendsyslog | SYSCALL_G2RFLAG, %g1       ! calling sys_sendsyslog
+       add %o7, 8, %g2                         ! just return on success
+       t ST_SYSCALL                            ! off to wonderland
+       retl
+        sub %g0, %o0, %o0                      ! error: result = -errno
index 8652252..d13d4bb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: syscall.h,v 1.26 2014/07/09 12:51:21 guenther Exp $ */
+/*     $OpenBSD: syscall.h,v 1.27 2014/07/14 03:54:51 deraadt Exp $ */
 
 /*
  * Copyright (c) 2001 Niklas Hallqvist
@@ -58,6 +58,7 @@ int   _dl_lstat(const char *, struct stat *);
 int    _dl_getcwd(char *, size_t);
 int    _dl_utrace(const char *, const void *, size_t);
 int    _dl_getentropy(char *, size_t);
+int    _dl_sendsyslog(const char *, size_t);
 
 static inline off_t
 _dl_lseek(int fildes, off_t offset, int whence)
index 6266095..ef86abb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: util.c,v 1.34 2014/07/06 07:39:07 otto Exp $  */
+/*     $OpenBSD: util.c,v 1.35 2014/07/14 03:54:50 deraadt Exp $       */
 
 /*
  * Copyright (c) 1998 Per Fogelstrom, Opsycon AB
@@ -42,6 +42,16 @@ void __stack_smash_handler(char [], int);
 void
 __stack_smash_handler(char func[], int damaged)
 {
+       extern const char *_dl_progname;
+       char message[100];
+
+       /* <10> indicates LOG_CRIT */
+       _dl_strlcpy(message, "<10>ld.so:", sizeof message);
+       _dl_strlcat(message, _dl_progname, sizeof message);
+       _dl_strlcat(message, "stack overflow in function ", sizeof message);
+       _dl_strlcat(message, func, sizeof message);
+
+       _dl_sendsyslog(message, _dl_strlen(message));
        _dl_exit(127);
 }