Просто хочу понять , это проблемы в сборке или все же баг в ф-ии как и PHP 5, там точно такакя же ошибка, и они написали что ее уже исправили. А про 4-ку ничего не нашел.
Это набор багов в ПХП. Как в четвертой, так и в пятой версии. В файле
/ext/gd/gd.c передаются некорректные аргументы в функцию
php_open_temporary_file:
Код:
tmp = php_open_temporary_file("", "", &path TSRMLS_CC);
Это ведет к вызову функции
php_do_open_temporary_file, находящейся в файле
/main/php_open_temporary_file.c. Ей передаются аргуметы со следующими значениями:
path="";
pfx="";
В этой функции есть код, содержащий еще один баг:
Код:
if (IS_SLASH(path[strlen(path)-1])) {
trailing_slash = "";
} else {
trailing_slash = "/";
}
Если длина строки
path равна нулю (а в нашем случае так и есть), то происходит попытка обращения за границы массива - к байту
path[-1]. Тут возможны три случая:
1) core dump
2) этот байт равен символу '/' или '\'. В этом случае ПХП попытается создать временный файл с именем
XXXXXX в текущей директории. Вот как образуется это имя:
Код:
(void)snprintf(opened_path, MAXPATHLEN, "%s%s%sXXXXXX", path, trailing_slash, pfx);
3) байт
path[-1] не равен '\' или '/'. Тогда ПХП попытается создать временный файл с именем
/XXXXXX, т.е. в корневом каталоге
При неудачной попытке создать временный файл в текущей или корневой директории ПХП пытается создать файл
XXXXXX в директории с именем, которое возвращает функция
php_get_temporary_directory, находящаяся тут же - в файле
/main/php_open_temporary_file.c. Под юниксами обычно это функция возвращает значение переменной окуржения с именем
TMPDIR.
На /tmp стоит полный доступ
AHTIXPICT, посмотри, что возвращает
. Скорее всего, не
/tmp.
Ugly bugfixes:
Cпособ 1. Наиболее корректный. Откройте файл
/ext/gd/gd.c и замените строчку
Код:
tmp = php_open_temporary_file("", "", &path TSRMLS_CC);
на
Код:
tmp = php_open_temporary_file(NULL, NULL, &path TSRMLS_CC);
Перекомпилируйте ПХП. После этого он не будет обращаться к недопустимому байту
path[-1] и не будет пытаться создать временный файл в текущей или корневой директории. Затем измените значение переменной окружения
TMPDIR на '/tmp' или установите права на запись для той директории, имя которой находится в
TMPDIR.
Способ 2. "Кривой". Установите права на запись в текущую директорию или, внимание,
lol, на корневую директорию. Это позволит ПХП создавать временные файлы в указанных директориях.
Баги присутствуют в самых свежих на данный момент версиях файлов
/ext/gd/gd.c и
/main/php_open_temporary_file.c:
http://cvs.php.net/co.php/php-src/ext/gd/gd.c?r=1.310
http://cvs.php.net/co.php/php-src/main/php_open_temporary_file.c?r=1.32
-~{}~ 06.05.05 18:58:
Задачка для размышления: что будет, если одновременно несколько ПХПшных скриптов попытаются сгенерить картинку?
Вот вам и multiprocess & multithread support
-~{}~ 06.05.05 19:35:
Дополнение: задачка для размышления оказалась надуманной. Имя файла генерится с помощью функции
mktemp под юникс или
GetTempFileName под виндой. Эти функции пытаются сгенерить уникальное имя файла, поэтому с многопоточностью тут все в порядке
