Dnia środa, 6 marzec 2024 10:09:30 (+01:00), Martin Storsjö napisał(a):
> On Mon, 4 Mar 2024, Martin Storsjö wrote: > > > Looking closer at our mkstemp implementation, we have this loop: > > > > /* > > Like OpenBSD, mkstemp() will try at least 2 ** 31 combinations before > > giving up. > > */ > > for (i = 0; i >= 0; i++) { > > for(j = index; j < len; j++) { > > template_name[j] = letters[rand () % 62]; > > } > > fd = _sopen(template_name, > > _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY, > > _SH_DENYNO, _S_IREAD | _S_IWRITE); > > if (fd != -1) return fd; > > if (fd == -1 && errno != EEXIST) return -1; > > } > > > > This should retry an absolutely insane number of times, so as long as one > > process finds a unique file name and stops iterating, the other parallel > > process should also find a unique one soon after, one would expect. > > > > So if this fails, it looks like something is fishy here; if we have this > > clash, do we hit the "if (fd == -1 && errno != EEXIST) return -1;" case > > directly on the first iteration? > > I tried reproducing this myself. I was able to hit the error, but only very > very rarely (I only reproduced it twice while running these loops for an hour > or two)). > > The loop does work as expected, normally - in most cases of collisions, we do > continue iterating. Only in a very very small fraction of cases, we end up > with errno set to something else than EEXIST, e.g. EACCES. And overall, > erroring out on EACCES is the right thing to do, otherwise we'd loop (near) > infinitely if trying to create a temp file in a directory without write > permission. > > So that clarifies the mystery to me. And the suggested fix of using rand_s() > sounds good to me, but we should keep a fallback to rand(). > > I'll post a new patch with that behaviour implemented, and with a slightly > updated commit message. > > // Martin > > _______________________________________________ > Mingw-w64-public mailing list > Mingw-w64-public@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mingw-w64-public > For some mysterious reason I was unable to reproduce the problem with toolchains provided by MSYS2. However using https://github.com/niXman/mingw-builds-binaries or my own toolchain built with crosstool-ng it took less than a minute for me using provided loops. Even GitHub actions reproduced the issue within 5 minutes: https://github.com/mati865/ehuss_test/actions/runs/7291015249/job/19869073666 Thank you for picking this up though. _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public