- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
<? die;
if($_GET['tn'])
{
if(($i = $conf['settings'][$s = "{$arg['modpath']}=>img"]) && ($img = explode(",", $i))){ $tn = array_combine($img, $img); }else{
$tn = array($_GET['tn']=>preg_replace('/[^0-9a-z_]/', '', $_GET['tn']));
} $sql = "SELECT `". mpquot($_GET['fn'] ? $_GET['fn'] : "img"). "` FROM {$conf['db']['prefix']}{$arg['modpath']}_{$tn[$_GET['tn']]} WHERE id=".(int)$_GET['id'];
$file_name = mpopendir("include")."/".($fn = mpql(mpqw($sql), 0, ($_GET['fn'] ? $_GET['fn'] : "img")));
if(!array_search(array_pop(explode('.', $file_name)), array(1=>"jpg", "jpeg", "png", "gif"))){
$file_name = mpopendir("img/ext/". array_pop(explode('.', $file_name)). ".png");
}
}else{
$file_name = mpopendir("modules/{$arg['modpath']}/img/". basename($_GET['']));
} header ("Content-type: image/". array_pop(explode('.', $file_name)));
echo mprs($file_name, $_GET['w'], $_GET['h'], $_GET['c']);
?>
Это ублюдочная ЖИРаф CMS? Их еще не расстреляли?
лицензий GPL
Добавена функция gvk gvk... прямо просится на govnokod...
Зато замена OR на AND в джвух запросах каким-то образом связана с её появлением... Неспроста же всё это в одном коммите...
в бейсике - kill.
Можно только догадываться, как жесток процессор и какие страсти творятся в ОЗУ .
Про потокобезопасность GetProcAddress ничего не нашел, но т.к. он ничего не меняет, а только читает пару структурок - скорее всего можно дергать из любых тредов в любое время.
Перед тобой четыре стула:
1) Сделать переменную s thread local (именно так поступили в сишной либе с функциями, подобными твоей). Но хрен знает, умеет ли делфи их делать. Я не спец по ней.
2) Выделять память под строку явно, копировать в нее данные, а на вызывающей стороне юзать и освобождать (здесь может быть проблемка, если делфя даёт каждой дллке свою кучу).
3) Выделять память на вызывающей стороне, а в функцию передавать указатель на буфер и его размер (как во многих WinAPI'шных функциях).
4) Тупо вернуть string. Если делфя умеет их передавать между dll'ками, конечно.
Я его боюсь. Будучи подключённым, он зачастую становится причиной экзотических багов. Компоненты его не все любят. Хотя, может, я что-то делаю не так? Хз.
да это ж ThreadVar! каждый поток получит свою копию переменной! какой же я олух, ей-богу. Спасибо!.. ;)
Возьму TlsSetValue ядрёны, схороню строки шарёны.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686991(v=vs.85).aspx
[code]
function test:pwidestring;stdcall;
var
str:widestring;
begin
str:='Тестовая строчка!';
result:=@str[1];
end;
]
░░░░░░░░░░░▄▄▄▄▄
░░░░░░░▄▄█████████▄▄
░░░░▄▀▀▀▀█▀▀▀▀▀▀█████▄
░░▄██████░░░░░░░░░░░▀██
░▐██████▌░░░░░░░░░░░░░▐▌
░███████▌░░░░░░░░░░░░░░█
▐████████░░░░░░░░░░░░░░░█
▐██████▌░░░░░▄▀▀▀▀▀▄░▀░▄▄▌
░█▀▀███▀░░░░░░▄▀█▀░░░▐▄▄▄▌
▐░▌▀▄░░░░░░░░░░▄▄▄▀░░░▌▀░▌
░▌▐░░▌░░░░░░░░░░░▀░░░░▐░▐
░▐░▀▄▐░░░░░░░░░░░▌▌░▄▄░▐░▌
░░▀█░▄▀░░░░░░░░░▐░▐▄▄▄▄▀▐
░░░▌▀░▐░░░░░░░░▄▀░░▀▀▀▀░▌
░░░▐░░░░░░░░░▌░░░▄▀▀▀▀▄▐
░░░▌░░░░░░░░░▐░░░░░▄▄░░▌
░░█▀▄░░░▐░▐░░░░░░░░░░░█
░█░█░▀▀▄░▌░█░░░▀▀▄▄▄▄▀
█░░░▀▄░░▀▀▄▄█░░░░░▄▀
░░░░░░▀▄░░░░▀▀▄▄▄▀▐
█░░░░░░░▀▄░░░░░▐░▌▐
░█░░░░░░░░▀▄░░░▌░▐▌▐
░░█░░░░░░░░░█░▐░▄▄▌░█▀▄
░░░█░░░░░░░░░█▌▐░▄▐░░▀▄▀▀▄▄
░░░░█░░░░░░░░░▀▄░░▐░░░▀▄░░░▀▀▄▄
░░░░░▀▄░▄▀█░░░░░█░░▌░░░░▀▄░░░░░█
Нет конечно. Ссылки на локальные переменные нельзя возвращать.
Забавно, но @str — это ссылка на локальную переменную (на стек), а @str[1] — это ссылка на кучу, т. е. не на локальную переменную, а туда, где выделил память конструктор pwidestring.