On 16 May 2016 10:02, Chet Ramey wrote: > On 5/13/16 2:40 PM, Mike Frysinger wrote: > > i was pointed at a bug report for FreeBSD systems [1] where running lots > > of processes in parallel would randomly fail with errors like: > > cannot make pipe for process substitution: File exists > > > > upstream FreeBSD addressed this by defining USE_MKTEMP [2] & USE_MKSTEMP > > [3] when building bash. looking at the source in bash though, i can't > > see why these aren't always defined. why does bash try to reimplement > > both funcs ad-hoc instead of just using the stable/guaranteed system > > versions ? > > Because many traditional implementations of mktemp/mkstemp suck.
and many modern implementations work perfectly fine. why is the default
to penalize good/fixed versions ? how about we flip this in config-top.h
like the attached patch ?
> > the bash versions seem like it's pretty trivial to collide: it mixes
> > current seconds count, current pid number, and a counter.
>
> Not quite; the calls in bash mix in the return value from the system's
> random(). Now, if that sucks too, you're going to lose.
except bash isn't calling srand anywhere that i can see, so you're
iterating over the same values every time. i'm not sure how this
implementation wouldn't also fall into the "inferior" bucket.
-mike
--- a/config-top.h
+++ b/config-top.h
@@ -152,3 +152,9 @@
/* Define to the maximum level of recursion you want for the source/. builtin.
0 means the limit is not active. */
#define SOURCENEST_MAX 0
+
+/* Define if your mktemp implementation is sane. */
+#define USE_MKTEMP
+
+/* Define if your mkstemp implementation is sane. */
+#define USE_MKTEMP
signature.asc
Description: Digital signature
