glibc/posix
Adhemerval Zanella 6c9e1be87a Fix writes past the allocated array bounds in execvpe (BZ#20847)
This patch fixes an invalid write out or stack allocated buffer in
2 places at execvpe implementation:

  1. On 'maybe_script_execute' function where it allocates the new
     argument list and it does not account that a minimum of argc
     plus 3 elements (default shell path, script name, arguments,
     and ending null pointer) should be considered.  The straightforward
     fix is just to take account of the correct list size on argument
     copy.

  2. On '__execvpe' where the executable file name lenght may not
     account for ending '\0' and thus subsequent path creation may
     write past array bounds because it requires to add the terminating
     null.  The fix is to change how to calculate the executable name
     size to add the final '\0' and adjust the rest of the code
     accordingly.

As described in GCC bug report 78433 [1], these issues were masked off by
GCC because it allocated several bytes more than necessary so that many
off-by-one bugs went unnoticed.

Checked on x86_64 with a latest GCC (7.0.0 20161121) with -O3 on CFLAGS.

	[BZ #20847]
	* posix/execvpe.c (maybe_script_execute): Remove write past allocated
	array bounds.
	(__execvpe): Likewise.

[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78433
2016-11-22 10:23:07 -02:00
..
bits
rxspencer
sys
_exit.c
alarm.c
annexc.c
BOOST.tests
bsd-getpgrp.c
bug-ga1.c
bug-ga2.c
bug-getopt1.c
bug-getopt2.c
bug-getopt3.c
bug-getopt4.c
bug-getopt5.c
bug-glob1.c
bug-glob2.c
bug-glob3.c
bug-regex1.c
bug-regex2.c
bug-regex3.c
bug-regex4.c
bug-regex5.c
bug-regex6.c
bug-regex7.c
bug-regex8.c
bug-regex9.c
bug-regex10.c
bug-regex11.c
bug-regex12.c
bug-regex13.c
bug-regex14.c
bug-regex15.c
bug-regex16.c
bug-regex17.c
bug-regex18.c
bug-regex19.c
bug-regex20.c
bug-regex21.c
bug-regex22.c
bug-regex23.c
bug-regex24.c
bug-regex25.c
bug-regex26.c
bug-regex27.c
bug-regex28.c
bug-regex29.c
bug-regex30.c
bug-regex31.c
bug-regex31.input
bug-regex32.c
bug-regex33.c
bug-regex34.c
bug-regex35.c
bug-regex36.c
confstr.c
cpio.h
Depend
environ.c
execl.c
execle.c
execlp.c
execv.c
execve.c
execvp.c
execvpe.c Fix writes past the allocated array bounds in execvpe (BZ#20847) 2016-11-22 10:23:07 -02:00
fexecve.c
fnmatch_loop.c
fnmatch.c
fnmatch.h
fork.c
fpathconf.c
gai_strerror.c
gai.conf
get_child_max.c
getaddrinfo.c
getconf-speclist.c
getconf.c
getegid.c
geteuid.c
getgid.c
getgroups.c
getopt1.c
getopt_init.c
getopt_int.h
getopt.c
getopt.h
getpgid.c
getpgrp.c
getpid.c
getppid.c
getresgid.c
getresuid.c
getsid.c
getuid.c
glob64.c
glob.c
glob.h
globtest.c
globtest.sh
group_member.c
init-posix.c
Makefile
nanosleep.c
pathconf.c
pause.c
PCRE.tests
posix_madvise.c
posix-conf-vars.h
posix-conf-vars.list
posix-envs.def
pread64.c
pread.c
ptestcases.h
PTESTS
PTESTS2C.sed
pwrite64.c
pwrite.c
re_comp.h
regcomp.c
regex_internal.c
regex_internal.h
regex.c
regex.h
regexbug1.c
regexec.c
runptests.c
runtests.c
sched_cpualloc.c
sched_cpucount.c
sched_cpufree.c
sched_getaffinity.c
sched_getp.c
sched_gets.c
sched_primax.c
sched_primin.c
sched_rr_gi.c
sched_setaffinity.c
sched_setp.c
sched_sets.c
sched_yield.c
sched.h
setgid.c
setpgid.c
setpgrp.c
setresgid.c
setresuid.c
setsid.c
setuid.c
sleep.c
spawn_faction_addclose.c
spawn_faction_adddup2.c
spawn_faction_addopen.c
spawn_faction_destroy.c
spawn_faction_init.c
spawn_int.h
spawn_valid_fd.c
spawn.c
spawn.h
spawnattr_destroy.c
spawnattr_getdefault.c
spawnattr_getflags.c
spawnattr_getpgroup.c
spawnattr_getschedparam.c
spawnattr_getschedpolicy.c
spawnattr_getsigmask.c
spawnattr_init.c
spawnattr_setdefault.c
spawnattr_setflags.c
spawnattr_setpgroup.c
spawnattr_setschedparam.c
spawnattr_setschedpolicy.c
spawnattr_setsigmask.c
spawni.c
spawnp.c
sysconf.c
tar.h
test-vfork.c
testcases.h
testfnm.c
TESTS
TESTS2C.sed
times.c
transbug.c
tst-boost.c
tst-chmod.c
tst-cpucount.c
tst-cpuset.c
tst-dir.c
tst-exec-static.c
tst-exec.c
tst-execl1.c
tst-execl2.c
tst-execle1.c
tst-execle2.c
tst-execlp1.c
tst-execlp2.c
tst-execv1.c
tst-execv2.c
tst-execve1.c
tst-execve2.c
tst-execvp1.c
tst-execvp2.c
tst-execvp3.c
tst-execvp4.c
tst-execvpe1.c
tst-execvpe2.c
tst-execvpe3.c
tst-execvpe4.c
tst-execvpe5.c
tst-execvpe6.c
tst-fnmatch2.c
tst-fnmatch3.c
tst-fnmatch.c
tst-fnmatch.input
tst-fork.c
tst-getaddrinfo2.c
tst-getaddrinfo3.c
tst-getaddrinfo4.c
tst-getaddrinfo5.c
tst-getaddrinfo.c
tst-getconf.sh
tst-getopt_long1.c
tst-gnuglob.c
tst-mmap-offset.c
tst-mmap.c
tst-nanosleep.c
tst-nice.c
tst-pathconf.c
tst-pcre.c
tst-posix_fadvise64.c
tst-posix_fadvise-common.c
tst-posix_fadvise.c
tst-posix_spawn-fd.c
tst-preadwrite64.c
tst-preadwrite-common.c
tst-preadwrite.c
tst-regex2.c
tst-regex.c
tst-regexloc.c
tst-rfc3484-2.c
tst-rfc3484-3.c
tst-rfc3484.c
tst-rxspencer-no-utf8.c
tst-rxspencer.c
tst-spawn2.c
tst-spawn3.c
tst-spawn-static.c
tst-spawn.c
tst-sysconf.c
tst-truncate64.c
tst-truncate-common.c
tst-truncate.c
tst-vfork1.c
tst-vfork2.c
tst-vfork3.c
tst-waitid.c
tstgetopt.c
uname-values.h
uname.c
unistd.h
Versions
vfork.c
wait3.c
wait4.c
wait.c
wait.h
waitid.c
waitpid.c
wordexp-test.c
wordexp-tst.sh
wordexp.c
wordexp.h