Skip to content

Commit deeefe3

Browse files
Fix bug swoole#4327 mkdir create failed on coroutines (swoole#4337)
* fix bug swoole#4327 * fix bug swoole#4327 * fix bug swoole#4327 * unit test * 代码格式 * 单元测试 * 修复无符号和有符号之间的比较 * unit test * unit test
1 parent 85ef982 commit deeefe3

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
--TEST--
2+
mkdir failed when coroutines: bug #4372
3+
--SKIPIF--
4+
<?php
5+
require __DIR__ . '/../../include/skipif.inc';
6+
?>
7+
--FILE--
8+
<?php
9+
10+
use Swoole\Coroutine;
11+
use Swoole\Coroutine\Barrier;
12+
use function Swoole\Coroutine\run;
13+
14+
require __DIR__.'/../../include/bootstrap.php';
15+
16+
Swoole\Runtime::enableCoroutine($flags = SWOOLE_HOOK_ALL);
17+
18+
function createDirectories($protocol = "")
19+
{
20+
$barrier = Barrier::make();
21+
$first = "$protocol/".rand(0, 1000);
22+
$second = "/".rand(0, 1000);
23+
$third = "/".rand(0, 1000)."/";
24+
25+
for ($i = 0; $i < 5; $i++) {
26+
Coroutine::create(static function () use ($i, $first, $second, $third, $barrier) {
27+
if (!mkdir($directory = $first.$second.$third.$i, 0755, true) && !is_dir($directory)) {
28+
throw new Exception("create directory failed");
29+
}
30+
rmdir($directory);
31+
});
32+
}
33+
echo "SUCCESS".PHP_EOL;
34+
35+
Barrier::wait($barrier);
36+
rmdir($first.$second.$third);
37+
rmdir($first.$second);
38+
rmdir($first);
39+
}
40+
41+
42+
run(function () {
43+
createDirectories();
44+
createDirectories("file://");
45+
});
46+
47+
Swoole\Runtime::enableCoroutine(false);
48+
createDirectories();
49+
createDirectories("file://");
50+
?>
51+
52+
--EXPECT--
53+
SUCCESS
54+
SUCCESS
55+
SUCCESS
56+
SUCCESS

thirdparty/php/streams/plain_wrapper.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ static int php_plain_files_mkdir(
10851085

10861086
if (p == buf) {
10871087
ret = mkdir(dir, mode);
1088-
} else if (!(ret = mkdir(buf, mode))) {
1088+
} else if (!(ret = mkdir(buf, mode)) || EEXIST == errno) {
10891089
if (!p) {
10901090
p = buf;
10911091
}
@@ -1094,6 +1094,11 @@ static int php_plain_files_mkdir(
10941094
if (*p == '\0') {
10951095
*p = DEFAULT_SLASH;
10961096
if ((*(p + 1) != '\0') && (ret = mkdir(buf, (mode_t) mode)) < 0) {
1097+
// parent directory already exists and try to create child directories.
1098+
if (EEXIST == errno && (int) strlen(buf) < dir_len) {
1099+
continue;
1100+
}
1101+
10971102
if (options & REPORT_ERRORS) {
10981103
php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
10991104
}

0 commit comments

Comments
 (0)