Merge "FORTIFY_SOURCE: add snprintf, vsnprintf"
diff --git a/libc/Jamfile b/libc/Jamfile
deleted file mode 100644
index a65be5d..0000000
--- a/libc/Jamfile
+++ /dev/null
@@ -1,441 +0,0 @@
-# This file is used to build the Bionic library with the Jam build
-# tool. For info, see www.perforce.com/jam/jam.html
-#
-
-BIONIC_TOP ?= $(DOT) ;
-
-DEBUG = 1 ;
-
-# pattern used for automatic heade inclusion detection
-HDRPATTERN = "^[ 	]*#[ 	]*include[ 	]*[<\"]([^\">]*)[\">].*$" ;
-
-
-# debugging support, simply define the DEBUG variable to activate verbose output
-rule Debug
-{
-    if $(DEBUG) {
-        Echo $(1) ;
-    }
-}
-
-# return all elements from $(1) that are not in $(2)
-rule Filter  list : filter
-{
-    local result = ;
-    local item ;
-    for item in $(list) {
-        if ! $(item) in $(filter) {
-            result += $(item) ;
-        }
-    }
-    return $(result) ;
-}
-
-
-# reverse a list of elements
-rule Reverse  list
-{
-    local  result = ;
-    local  item ;
-
-    for item in $(list) {
-        result = $(item) $(result) ;
-    }
-    return $(result) ;
-}
-
-
-# decompose a path into a list of elements
-rule PathDecompose  dir
-{
-    local  result ;
-
-    while $(dir:D)
-    {
-        if ! $(dir:BS) {  # for rooted paths like "/foo"
-            break ;
-        }
-        result = $(dir:BS) $(result) ;
-        dir    = $(dir:D) ;
-    }
-    result = $(dir) $(result) ;
-    return $(result) ;
-}
-
-
-# simply a file path, i.e. get rid of . or .. when possible
-rule _PathSimplify  dir
-{
-    local  result = ;
-    local  dir2 d ;
-
-    dir  = [ PathDecompose $(dir) ] ;
-
-    # get rid of any single dot
-    dir2 = ;
-    for d in $(dir) {
-        if $(d) = "." {
-            continue ;
-        }
-        dir2 += $(d) ;
-    }
-
-    # get rid of .. when possible
-    for d in $(dir2) {
-        if $(d) = ".." && $(result) {
-            result = $(result[2-]) ;
-        }
-        else
-            result = $(d) $(result) ;
-    }
-
-    # now invert the result
-    result = [ Reverse $(result) ] ;
-    if ! $(result) {
-        result = "." ;
-    }
-    return $(result:J="/") ;
-}
-
-
-rule PathSimplify  dirs
-{
-    local result ;
-    local d ;
-    for d in $(dirs) {
-        result += [ _PathSimplify $(d) ] ;
-    }
-    return $(result) ;
-}
-
-
-# retrieve list of subdirectories
-rule ListSubDirs  paths
-{
-    local  result  = ;
-    local  entry ;
-    for entry in [ Glob $(paths) : * ] {
-        if ! $(entry:S) {
-            result += $(entry) ;
-        }
-    }
-    return [ PathSimplify $(result) ] ;
-}
-
-
-# retrieve list of sources in a given directory
-rule ListSources  path
-{
-    return [ Glob $(path) : *.S *.c ] ;
-}
-
-
-# find the prebuilt directory
-#
-if ! $(TOP) {
-    Echo "Please define TOP as the root of your device build tree" ;
-    Exit ;
-}
-
-Debug "OS is" $(OS) ;
-Debug "CPU is" $(CPU) ;
-
-if $(OS) = LINUX
-{
-    PREBUILT = $(TOP)/prebuilt/Linux ;
-}
-else if $(OS) = MACOSX
-{
-    switch $(CPU) {
-        case i386 : PREBUILT = $(TOP)/prebuilt/darwin-x86 ; break ;
-        case ppc  : PREBUILT = $(TOP)/prebuilt/darwin-ppc ; break ;
-        case *    : Echo "unsupported CPU" "$(CPU) !!" ;
-                    Echo "Please contact digit@google.com for help" ;
-                    Exit ;
-    }
-}
-else
-{
-    Echo "Unsupported operating system" $(OS) ;
-    Echo "Please contact digit@google.com for help" ;
-    Exit ;
-}
-
-Debug "TOP is" $(TOP) ;
-Debug "PREBUILT is" $(PREBUILT) ;
-
-
-# check architectures and setup toolchain variables
-#
-SUPPORTED_ARCHS = x86 arm ;
-
-ARCH ?= $(SUPPORTED_ARCHS) ;
-
-if ! $(ARCH) in $(SUPPORTED_ARCHS) {
-    Echo "The variable ARCH contains an unsupported value, use one or more of these instead" ;
-    Echo "separated by spaces:" $(SUPPORTED_ARCHS) ;
-    Exit ;
-}
-
-x86_TOOLSET_PREFIX ?= "" ;
-arm_TOOLSET_PREFIX ?= $(TOP)/prebuilt/Linux/toolchain-4.1.1/bin/arm-elf- ;
-
-for arch in $(ARCH) {
-    CC_$(arch)  = $($(arch)_TOOLSET_PREFIX)gcc ;
-    C++_$(arch) = $($(arch)_TOOLSET_PREFIX)g++ ;
-    AR_$(arch)  = $($(arch)_TOOLSET_PREFIX)ar ;
-}
-
-
-# the list of arch-independent source subdirectories
-BIONIC_SRC_SUBDIRS = string ;
-BIONIC_x86_SUBDIRS = ;
-BIONIC_arm_SUBDIRS = ;
-
-CFLAGS   = -O0 -g -W ;
-
-
-
-# find sources in a given list of subdirectories
-rule FindSources  dirs
-{
-    local dir ;
-
-    for dir in $(dirs)
-    {
-        local LOCAL_SRC NO_LOCAL_SRC ;
-
-        if [ Glob $(dir) : rules.jam ] {
-            include $(dir)/rules.jam ;
-            if $(LOCAL_SRC) {
-                _sources = $(LOCAL_SRC) ;
-            }
-            else {
-                _sources = [ Glob $(dir) : *.S *.c ] ;
-                _sources = $(_sources:BS) ;
-            }
-            if $(NO_LOCAL_SRC) {
-                _sources = [ Filter $(_sources) : $(NO_LOCAL_SRC) ] ;
-            }
-            sources += $(dir)/$(_sources) ;
-        }
-        else
-            sources += [ ListSources $(dir) ] ;
-    }
-}
-
-# Compile a given object file from a source
-rule Compile  object : source
-{
-    Depends $(object) : $(source) ;
-    Depends bionic : $(object) ;
-    Clean clean : $(object) ;
-
-    MakeLocate $(object) : $(OUT) ;
-
-
-    CC on $(object)       = $(CC_$(arch)) ;
-    CFLAGS on $(object)   = $(CFLAGS) ;
-    INCLUDES on $(object) = $(INCLUDES) ;
-    DEFINES on $(object)  = $(DEFINES) ;
-
-    HDRRULE on $(>) = HdrRule ;
-    HDRSCAN on $(>) = $(HDRPATTERN) ;
-    HDRSEARCH on $(>) = $(INCLUDES) ;
-    HDRGRIST on $(>) = $(HDRGRIST) ;
-}
-
-
-actions Compile
-{
-    $(CC) -c -o $(1) $(CFLAGS) -I$(INCLUDES) -D$(DEFINES) $(2)
-}
-
-
-rule RmTemps
-{
-    Temporary $(2) ;
-}
-
-actions quietly updated piecemeal together RmTemps
-{
-    rm -f $(2)
-}
-
-actions Archive
-{
-    $(AR) ru $(1) $(2)
-}
-
-rule Library  library : objects
-{
-    local  obj ;
-
-    if ! $(library:S) {
-        library = $(library:S=.a) ;
-    }
-    library = $(library:G=<$(arch)>) ;
-
-    Depends all : $(library) ;
-
-    if ! $(library:D) {
-        MakeLocate $(library) $(library)($(objects:BS)) : $(OUT) ;
-    }
-
-    Depends $(library) : $(library)($(objects:BS)) ;
-    for obj in $(objects) {
-        Depends $(library)($(obj:BS)) : $(obj) ;
-    }
-
-    Clean clean : $(library) ;
-
-    AR on $(library) = $(AR_$(arch)) ;
-    Archive $(library) : $(objects) ;
-
-    RmTemps $(library) : $(objects) ;
-}
-
-
-rule  ProcessDir
-{
-    local CFLAGS   = $(CFLAGS) ;
-    local DEFINES  = $(DEFINES) ;
-    local INCLUDES = $(INCLUDES) ;
-    local local_rules = [ Glob $(1) : rules.jam ] ;
-    local source sources ;
-
-    if $(local_rules) {
-        local LOCAL_CFLAGS LOCAL_DEFINES LOCAL_INCLUDES LOCAL_SRC NO_LOCAL_SRC ;
-
-        include $(local_rules) ;
-        CFLAGS   += $(LOCAL_CFLAGS) ;
-        DEFINES  += $(LOCAL_DEFINES) ;
-        INCLUDES += $(LOCAL_INCLUDES) ;
-
-        if $(LOCAL_SRC) {
-            sources = $(LOCAL_SRC) ;
-        }
-        else {
-            sources = [ Glob $(1) : *.S *.c ] ;
-            sources = $(sources:BS) ;
-        }
-
-        if $(NO_LOCAL_SRC) {
-            sources = [ Filter $(sources) : $(NO_LOCAL_SRC) ] ;
-        }
-
-        sources = $(1)/$(sources) ;
-    }
-    else
-        sources = [ Glob $(1) : *.S *.c ] ;
-
-    for source in $(sources) {
-        local name = $(source:B) ;
-
-        if $(source:S) = ".S" {
-            # record the list of assembler sources
-            ASSEMBLER_SOURCES += $(name) ;
-        }
-        else if $(source:S) = ".c" && $(name) in $(ASSEMBLER_SOURCES) {
-            # skip C source file if corresponding assembler exists
-            continue ;
-        }
-
-        objname = <$(arch)>$(name).o  ;
-
-        Compile $(objname) : $(source) ;
-        ALL_OBJECTS += $(objname) ;
-    }
-}
-
-rule ProcessDirs
-{
-    local  dir ;
-    for dir in $(1) {
-        ProcessDir $(dir) ;
-    }
-}
-
-INCLUDES_x86 = /usr/src/linux/include ;
-
-INCLUDES_arm = ../kernel_headers
-               include/arch/arm
-               include/bits32
-               ;
-
-INCLUDES = include stdio string stdlib .
-           ../msun/include
-           ;
-
-DEFINES  = ANDROID_CHANGES
-           USE_LOCKS
-           REALLOC_ZERO_BYTES_FREES
-           _LIBC=1
-           SOFTFLOAT
-           FLOATING_POINT
-           NEED_PSELECT=1
-           ANDROID
-           ;
-
-CFLAGS_x86 = ;
-
-
-for arch in $(ARCH)
-{
-    local ARCH_DIR = $(BIONIC_TOP)/arch-$(arch) ;
-    local INCLUDES = $(INCLUDES_$(arch)) $(ARCH_DIR)/include $(INCLUDES) ;
-    local DEFINES  = $(DEFINES_$(arch)) $(DEFINES) ARCH=$(arch)  ;
-    local CFLAGS   = $(CFLAGS) $(CFLAGS_$(arch)) ;
-    local OUT      = out/$(arch) ;
-    local ASSEMBLER_SOURCES ALL_OBJECTS ;
-
-    ProcessDirs [ ListSubDirs $(ARCH_DIR) ] ;
-    ProcessDirs stdlib stdio unistd string tzcode inet ;
-    ProcessDirs [ ListSubDirs netbsd ] ;
-    ProcessDirs bionic ;
-
-    Library bionic : $(ALL_OBJECTS) ;
-}
-
-BIONIC_SEARCH = $(BIONIC_TOP)/include ;
-
-
-
-# /HdrRule source : headers ;
-#
-# Arranges the proper dependencies when the file _source_ includes the files
-# _headers_ through the #include C preprocessor directive
-#
-# this rule is not intendend to be called explicitely. It is called
-# automatically during header scanning on sources handled by the @Object
-# rule (e.g. sources in @Main or @Library rules)
-#
-rule HdrRule
-{
-    # HdrRule source : headers ;
-
-    # N.B.  This rule is called during binding, potentially after
-    # the fate of many targets has been determined, and must be
-    # used with caution: don't add dependencies to unrelated
-    # targets, and don't set variables on $(<).
-
-    # Tell Jam that anything depending on $(<) also depends on $(>),
-    # set SEARCH so Jam can find the headers, but then say we don't
-    # care if we can't actually find the headers (they may have been
-    # within ifdefs),
-
-    local s = $(>:G=$(HDRGRIST:E)) ;
-
-    Includes $(<) : $(s) ;
-    SEARCH on $(s) = $(HDRSEARCH) ;
-    NoCare $(s) ;
-
-    # Propagate on $(<) to $(>)
-
-    HDRSEARCH on $(s) = $(HDRSEARCH) ;
-    HDRSCAN on $(s) = $(HDRSCAN) ;
-    HDRRULE on $(s) = $(HDRRULE) ;
-    HDRGRIST on $(s) = $(HDRGRIST) ;
-}
-
-
diff --git a/libc/include/net/if_dl.h b/libc/include/net/if_dl.h
deleted file mode 100644
index 1f0c080..0000000
--- a/libc/include/net/if_dl.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*	$NetBSD: if_dl.h,v 1.18 2005/12/11 23:05:24 thorpej Exp $	*/
-
-/*
- * Copyright (c) 1990, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *	@(#)if_dl.h	8.1 (Berkeley) 6/10/93
- */
-
-/*
- * A Link-Level Sockaddr may specify the interface in one of two
- * ways: either by means of a system-provided index number (computed
- * anew and possibly differently on every reboot), or by a human-readable
- * string such as "il0" (for managerial convenience).
- *
- * Census taking actions, such as something akin to SIOCGCONF would return
- * both the index and the human name.
- *
- * High volume transactions (such as giving a link-level ``from'' address
- * in a recvfrom or recvmsg call) may be likely only to provide the indexed
- * form, (which requires fewer copy operations and less space).
- *
- * The form and interpretation  of the link-level address is purely a matter
- * of convention between the device driver and its consumers; however, it is
- * expected that all drivers for an interface of a given if_type will agree.
- */
-
-#ifndef _NET_IF_DL_H_
-#define _NET_IF_DL_H_
-
-#include <sys/socket.h>
-
-/*
- * Structure of a Link-Level sockaddr:
- */
-struct sockaddr_dl {
-	u_char	    sdl_len;	/* Total length of sockaddr */
-	sa_family_t sdl_family;	/* AF_LINK */
-	u_int16_t   sdl_index;	/* if != 0, system given index for interface */
-	u_char	    sdl_type;	/* interface type */
-	u_char	    sdl_nlen;	/* interface name length, no trailing 0 reqd. */
-	u_char	    sdl_alen;	/* link level address length */
-	u_char	    sdl_slen;	/* link layer selector length */
-	char	    sdl_data[12]; /* minimum work area, can be larger;
-				     contains both if name and ll address */
-};
-
-/* We do arithmetic directly with these, so keep them char instead of void */
-#define LLADDR(s) ((char *)((s)->sdl_data + (s)->sdl_nlen))
-#define CLLADDR(s) ((const char *)((s)->sdl_data + (s)->sdl_nlen))
-
-#ifndef _KERNEL
-
-#include <sys/cdefs.h>
-
-__BEGIN_DECLS
-void	link_addr(const char *, struct sockaddr_dl *);
-char	*link_ntoa(const struct sockaddr_dl *);
-__END_DECLS
-
-#endif /* !_KERNEL */
-
-#endif /* !_NET_IF_DL_H_ */
diff --git a/libc/netbsd/net/getnameinfo.c b/libc/netbsd/net/getnameinfo.c
index 8a1e95e..d8ac037 100644
--- a/libc/netbsd/net/getnameinfo.c
+++ b/libc/netbsd/net/getnameinfo.c
@@ -53,7 +53,9 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <net/if.h>
+#if defined(ANDROID_CHANGES) && defined(AF_LINK)
 #include <net/if_dl.h>
+#endif
 #include <net/if_ieee1394.h>
 #include <net/if_types.h>
 #include <netinet/in.h>
@@ -104,8 +106,10 @@
 static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t,
 				 int));
 #endif
+#if defined(ANDROID_CHANGES) && defined(AF_LINK)
 static int getnameinfo_link __P((const struct sockaddr *, socklen_t, char *,
     socklen_t, char *, socklen_t, int));
+#endif
 static int hexname __P((const u_int8_t *, size_t, char *, socklen_t));
 
 // This should be synchronized to ResponseCode.h
@@ -123,7 +127,7 @@
 	case AF_INET6:
 		return getnameinfo_inet(sa, salen, host, hostlen,
 		    serv, servlen, flags);
-#if 0
+#if defined(ANDROID_CHANGES) && defined(AF_LINK)
 	case AF_LINK:
 		return getnameinfo_link(sa, salen, host, hostlen,
 		    serv, servlen, flags);
@@ -408,7 +412,7 @@
 #endif
 
 		if (hp) {
-#if 0
+#if defined(ANDROID_CHANGES) && defined(AF_LINK)
 			/*
 			 * commented out, since "for local host" is not
 			 * implemented here - see RFC2553 p30
@@ -546,6 +550,7 @@
 #endif /* INET6 */
 
 
+#if defined(ANDROID_CHANGES) && defined(AF_LINK)
 /*
  * getnameinfo_link():
  * Format a link-layer address into a printable format, paying attention to
@@ -623,6 +628,7 @@
 		    (size_t)sdl->sdl_alen, host, hostlen);
 	}
 }
+#endif
 
 static int
 hexname(cp, len, host, hostlen)
diff --git a/libc/netbsd/resolv/res_send.c b/libc/netbsd/resolv/res_send.c
index dbad6dd..53c492f 100644
--- a/libc/netbsd/resolv/res_send.c
+++ b/libc/netbsd/resolv/res_send.c
@@ -1144,6 +1144,9 @@
 		 * XXX - potential security hazard could
 		 *	 be detected here.
 		 */
+#ifdef ANDROID_CHANGES
+		__libc_android_log_event_uid(BIONIC_EVENT_RESOLVER_OLD_RESPONSE);
+#endif
 		DprintQ((statp->options & RES_DEBUG) ||
 			(statp->pfcode & RES_PRF_REPLY),
 			(stdout, ";; old answer:\n"),
@@ -1157,6 +1160,9 @@
 		 * XXX - potential security hazard could
 		 *	 be detected here.
 		 */
+#ifdef ANDROID_CHANGES
+		__libc_android_log_event_uid(BIONIC_EVENT_RESOLVER_WRONG_SERVER);
+#endif
 		DprintQ((statp->options & RES_DEBUG) ||
 			(statp->pfcode & RES_PRF_REPLY),
 			(stdout, ";; not our server:\n"),
@@ -1187,6 +1193,9 @@
 		 * XXX - potential security hazard could
 		 *	 be detected here.
 		 */
+#ifdef ANDROID_CHANGES
+		__libc_android_log_event_uid(BIONIC_EVENT_RESOLVER_WRONG_QUERY);
+#endif
 		DprintQ((statp->options & RES_DEBUG) ||
 			(statp->pfcode & RES_PRF_REPLY),
 			(stdout, ";; wrong query name:\n"),
diff --git a/libc/private/logd.h b/libc/private/logd.h
index 37d4104..8970daf 100644
--- a/libc/private/logd.h
+++ b/libc/private/logd.h
@@ -30,6 +30,21 @@
 
 #include <stdarg.h>
 
+#define BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW 80100
+#define BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW 80105
+#define BIONIC_EVENT_MEMMOVE_BUFFER_OVERFLOW 80110
+#define BIONIC_EVENT_STRNCAT_BUFFER_OVERFLOW 80115
+#define BIONIC_EVENT_STRNCPY_BUFFER_OVERFLOW 80120
+#define BIONIC_EVENT_MEMSET_BUFFER_OVERFLOW 80125
+#define BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW 80130
+
+#define BIONIC_EVENT_STRCAT_INTEGER_OVERFLOW 80200
+#define BIONIC_EVENT_STRNCAT_INTEGER_OVERFLOW 80205
+
+#define BIONIC_EVENT_RESOLVER_OLD_RESPONSE 80300
+#define BIONIC_EVENT_RESOLVER_WRONG_SERVER 80305
+#define BIONIC_EVENT_RESOLVER_WRONG_QUERY 80310
+
 enum  {
     ANDROID_LOG_UNKNOWN = 0,
     ANDROID_LOG_DEFAULT,    /* only for SetMinPriority() */
diff --git a/libc/string/__memcpy_chk.c b/libc/string/__memcpy_chk.c
index aed3ec2..e79f6ac 100644
--- a/libc/string/__memcpy_chk.c
+++ b/libc/string/__memcpy_chk.c
@@ -47,6 +47,7 @@
     if (len > dest_len) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** memcpy buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__memmove_chk.c b/libc/string/__memmove_chk.c
index 5a6eb4d..529eb8f 100644
--- a/libc/string/__memmove_chk.c
+++ b/libc/string/__memmove_chk.c
@@ -47,6 +47,7 @@
     if (len > dest_len) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** memmove buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_MEMMOVE_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__memset_chk.c b/libc/string/__memset_chk.c
index 1ccfd46..0904c03 100644
--- a/libc/string/__memset_chk.c
+++ b/libc/string/__memset_chk.c
@@ -46,6 +46,7 @@
     if (n > dest_len) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** memset buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_MEMSET_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__strcat_chk.c b/libc/string/__strcat_chk.c
index 7d8c89f..4665d66 100644
--- a/libc/string/__strcat_chk.c
+++ b/libc/string/__strcat_chk.c
@@ -50,11 +50,17 @@
     size_t sum;
 
     // sum = src_len + dest_len + 1 (with overflow protection)
-    if (!safe_add3(&sum, src_len, dest_len, 1U)) abort();
+    if (!safe_add3(&sum, src_len, dest_len, 1U)) {
+        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
+            "*** strcat integer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRCAT_INTEGER_OVERFLOW);
+        abort();
+    }
 
     if (sum > dest_buf_size) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** strcat buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRNCAT_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__strcpy_chk.c b/libc/string/__strcpy_chk.c
index 85aa19d..79486b4 100644
--- a/libc/string/__strcpy_chk.c
+++ b/libc/string/__strcpy_chk.c
@@ -48,6 +48,7 @@
     if (src_len > dest_len) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** strcpy buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__strncat_chk.c b/libc/string/__strncat_chk.c
index 0387626..2036c9f 100644
--- a/libc/string/__strncat_chk.c
+++ b/libc/string/__strncat_chk.c
@@ -54,11 +54,17 @@
 
     size_t sum;
     // sum = src_len + dest_len + 1 (with overflow protection)
-    if (!safe_add3(&sum, src_len, dest_len, 1U)) abort();
+    if (!safe_add3(&sum, src_len, dest_len, 1U)) {
+        __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
+            "*** strncat integer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRNCAT_INTEGER_OVERFLOW);
+        abort();
+    }
 
     if (sum > dest_buf_size) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** strncat buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRNCAT_BUFFER_OVERFLOW);
         abort();
     }
 
diff --git a/libc/string/__strncpy_chk.c b/libc/string/__strncpy_chk.c
index b87ef4b..3f9e9fb 100644
--- a/libc/string/__strncpy_chk.c
+++ b/libc/string/__strncpy_chk.c
@@ -47,6 +47,7 @@
     if (len > dest_len) {
         __libc_android_log_print(ANDROID_LOG_FATAL, "libc",
             "*** strncpy buffer overflow detected ***\n");
+        __libc_android_log_event_uid(BIONIC_EVENT_STRNCPY_BUFFER_OVERFLOW);
         abort();
     }