cpu% ramfs cpu% echo a | tee `{seq 1 1000} tee 62609: warning: process exceeds 100 file descriptors tee 62609: warning: process exceeds 200 file descriptors tee 62609: suicide: sys: trap: fault write addr=0x9000 pc=0x00001200 cpu% echo a | /sys/src/cmd/8.tee `{seq 1 1000} 8.tee 62651: warning: process exceeds 100 file descriptors 8.tee 62651: warning: process exceeds 200 file descriptors 8.tee 62651: warning: process exceeds 300 file descriptors 8.tee 62651: warning: process exceeds 400 file descriptors 8.tee 62651: warning: process exceeds 500 file descriptors 8.tee 62651: warning: process exceeds 600 file descriptors 8.tee 62651: warning: process exceeds 700 file descriptors 8.tee 62651: warning: process exceeds 800 file descriptors 8.tee 62651: warning: process exceeds 900 file descriptors 8.tee 62651: warning: process exceeds 1000 file descriptors a cpu% ls -l | wc -l 1000 cpu% If you dislike the dynamic alloc, optionally one could keep the array for 100 files swapping in a malloc-ed one only when there are 100+ arguments provided. NB: a previous version of this patch failed to allow room for the stdout descriptor to be added to the array. Reference: /n/sources/patch/applied/tee-overflow Date: Fri Nov 30 06:03:07 CET 2012 Signed-off-by: mirtchovski@gmail.com --- /sys/src/cmd/tee.c Fri Nov 30 06:01:05 2012 +++ /sys/src/cmd/tee.c Fri Nov 30 06:01:03 2012 @@ -7,7 +7,7 @@ int uflag; int aflag; -int openf[100]; +int *openf; char in[8192]; @@ -38,7 +38,11 @@ exits("usage"); } ARGEND - USED(argc); + openf = malloc((1+argc)*sizeof(int)); + if(openf == nil) { + sysfatal("malloc failed"); + } + n = 0; while(*argv) { if(aflag) {