summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/execve.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/execve.c')
-rw-r--r--sysdeps/unix/sysv/linux/execve.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/execve.c b/sysdeps/unix/sysv/linux/execve.c
index 89620ede48..31277d040e 100644
--- a/sysdeps/unix/sysv/linux/execve.c
+++ b/sysdeps/unix/sysv/linux/execve.c
@@ -21,9 +21,11 @@
 
 #include <sysdep.h>
 #include <sys/syscall.h>
+#include <bp-checks.h>
 
-extern int __syscall_execve (const char *file, char *const argv[],
-			     char *const envp[]);
+extern int __syscall_execve (const char *__unbounded file,
+			     char *__unbounded const *__unbounded argv,
+			     char *__unbounded const *__unbounded envp);
 extern void __pthread_kill_other_threads_np (void);
 weak_extern (__pthread_kill_other_threads_np)
 
@@ -37,7 +39,32 @@ __execve (file, argv, envp)
   /* If this is a threaded application kill all other threads.  */
   if (__pthread_kill_other_threads_np)
     __pthread_kill_other_threads_np ();
+#if __BOUNDED_POINTERS__
+  {
+    char **v;
+    int i;
+    char *__unbounded *__unbounded ubp_argv;
+    char *__unbounded *__unbounded ubp_envp;
+    char *__unbounded *__unbounded ubp_v;
 
+    for (v = argv; *v; v++)
+      ;
+    i = v - argv + 1;
+    ubp_argv = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_argv) * i);
+    for (v = argv, ubp_v = ubp_argv; i--; v++, ubp_v++)
+      *ubp_v = CHECK_STRING (*v);
+
+    for (v = envp; *v; v++)
+      ;
+    i = v - envp + 1;
+    ubp_envp = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_envp) * i);
+    for (v = envp, ubp_v = ubp_envp; i--; v++, ubp_v++)
+      *ubp_v = CHECK_STRING (*v);
+
+    return INLINE_SYSCALL (execve, 3, CHECK_STRING (file), ubp_argv, ubp_envp);
+  }
+#else
   return INLINE_SYSCALL (execve, 3, file, argv, envp);
+#endif
 }
 weak_alias (__execve, execve)