From 3244d9f07fda946d62afdfa61ed5a876d380d0ff Mon Sep 17 00:00:00 2001
From: Daniel Micay <danielmicay@gmail.com>
Date: Sat, 18 Apr 2015 13:04:19 -0400
Subject: [PATCH] add a fortified implementation of realpath

Change-Id: Icc59eacd1684f7cddd83d7a2b57dad0c7ada5eb7
---
 libc/include/stdlib.h | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index 84bf56dee..efca5774a 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -176,6 +176,27 @@ extern size_t __ctype_get_mb_cur_max(void);
 #include <android/legacy_stdlib_inlines.h>
 #endif
 
+#if defined(__BIONIC_FORTIFY)
+
+extern char* __realpath_real(const char*, char*) __RENAME(realpath);
+__errordecl(__realpath_size_error, "realpath output parameter must be NULL or a >= PATH_MAX bytes buffer");
+
+#if !defined(__clang__)
+__BIONIC_FORTIFY_INLINE
+char* realpath(const char* path, char* resolved) {
+    size_t bos = __bos(resolved);
+
+    /* PATH_MAX is unavailable without polluting the namespace, but it's always 4096 on Linux */
+    if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE && bos < 4096) {
+        __realpath_size_error();
+    }
+
+    return __realpath_real(path, resolved);
+}
+#endif
+
+#endif /* defined(__BIONIC_FORTIFY) */
+
 __END_DECLS
 
 #endif /* _STDLIB_H */