1. Pascal / Говнокод #17484

    +91

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 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']);
    
    ?>

    это не шуууутки мы встретились в маршруууутке

    Запостил: deconf, 20 Января 2015

    Комментарии (49) RSS

    • Где здесь Pascal, deconf?
      Ответить
    • >mpql
      Это ублюдочная ЖИРаф CMS? Их еще не расстреляли?
      Ответить
      • показать все, что скрытода, это она а откуда ты знаеш? это внутрення разработка одного дебила который походу работает только в амфетамине
        Ответить
        • Портальная система Жираф.
          лицензий GPL
          Ответить
        • Какой няшный коммит! https://github.com/mpak2/mpak.su/commit/4f7cbf2a6a45da64b27aa4855139e8303d06a7b4
          Ответить
          • https://github.com/mpak2/mpak.su/commit/722310e5dbd450e3d6563ef9d9dc6499782e6433
            Добавена функция gvk
            function gvk($array = array(), $field=false){
            	return isset($array[$field]) ? $array[$field] : FALSE;
            }
            gvk... прямо просится на govnokod...
            Ответить
            • при этом в рамках коммита не видно использования этой невероятно полезной функци. А ещё в коммит входит бинарник...
              Ответить
              • > использования этой невероятно полезной функци
                Зато замена OR на AND в джвух запросах каким-то образом связана с её появлением... Неспроста же всё это в одном коммите...
                Ответить
    • >>die;
      в бейсике - kill.
      Можно только догадываться, как жесток процессор и какие страсти творятся в ОЗУ .
      Ответить
    • Помогите с dll, плз. Можно ли возвращать строки вот так:

      function Isyvgr(len:integer):pchar; stdcall; external 'project2';
      код вызывающей проги:
      implementation
      
      {$R *.dfm}
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        s:string;
      begin
        s:=strpas(isyvgr(8));
      end;
      
      код в DLL:
      var
          s:string; // локальные строковые переменные опасно возвращать, ММ потрёт указатель.
      function Insyvgr(len:integer):pchar;stdcall;export;
      begin
         s:=// заполняем строку...
        result:=pchar(s);
      end;
      Ответить
      • Только если Isyvgr не вызывают из разных потоков.
        Ответить
        • Да, я тоже думал об этом. Большое спасибо, Борманд! ;) Тогда другой вопрос. Допустимо ли лезть из разных потоков к 1 хендлу, от вызова LoadLibrary? на мой взгляд это UB. Нет же ничего плохого, если каждый поток подгрузит свою копию образа?
          Ответить
          • Если верить доке по DllMain, в загрузчике dll'ок есть мутекс (loader lock), из-за которого они грузятся по порядку и ровно по одному разу каждая. Поэтому если ты сделаешь LoadLibrary из разных тредов, то загрузится только одна копия дллки, а все потоки получат одинаковый хендл на неё. Как-то так.

            Про потокобезопасность GetProcAddress ничего не нашел, но т.к. он ничего не меняет, а только читает пару структурок - скорее всего можно дергать из любых тредов в любое время.
            Ответить
            • Какой кошмар :O А как тогда быть?
              Ответить
              • А в чем кошмар? Если тебе хочется по копии дллки на тред, то ты явно делаешь что-то не так...
                Ответить
                • Но если вызвать экспортируемую функцию описанную выше из разных потоков, глобальная строковая переменная неинуемо будет перезаписана, это приведёт к хаосу, а иного способа вернуть строчку вроде нет. Есть ещё заморочка с выделением буфера, как в API, но там надо заранее знать размер.
                  Ответить
                  • > а иного способа вернуть строчку вроде нет
                    Перед тобой четыре стула:
                    1) Сделать переменную s thread local (именно так поступили в сишной либе с функциями, подобными твоей). Но хрен знает, умеет ли делфи их делать. Я не спец по ней.
                    2) Выделять память под строку явно, копировать в нее данные, а на вызывающей стороне юзать и освобождать (здесь может быть проблемка, если делфя даёт каждой дллке свою кучу).
                    3) Выделять память на вызывающей стороне, а в функцию передавать указатель на буфер и его размер (как во многих WinAPI'шных функциях).
                    4) Тупо вернуть string. Если делфя умеет их передавать между dll'ками, конечно.
                    Ответить
                    • дельфя умеет. там нужен bormandmm.dll только
                      Ответить
                      • >>bormandmm.dll
                        Я его боюсь. Будучи подключённым, он зачастую становится причиной экзотических багов. Компоненты его не все любят. Хотя, может, я что-то делаю не так? Хз.
                        Ответить
                    • >>1) Сделать переменную s thread local (именно так поступили в сишной либе с функциями, подобными твоей). Но хрен знает, умеет ли делфи их делать. Я не спец по ней.

                      да это ж ThreadVar! каждый поток получит свою копию переменной! какой же я олух, ей-богу. Спасибо!.. ;)
                      Ответить
                      • ThreadVar течёт. Т.е. это равносильно явному выделению памяти.
                        Ответить
                    • показать все, что скрыто>Перед тобой четыре стула:
                      Возьму TlsSetValue ядрёны, схороню строки шарёны.
                      Ответить
                    • Оказалось, что можно возвращать WideString. Это особый строковый тип, при копировании, копируется не указатель на строку, а создаётся ее копия. Безопасно ли будет вернуть указатель на нее?

                      [code]


                      function
                      test:pwidestring;stdcall;
                      var
                      str:widestring;
                      begin
                      str:='Тестовая строчка!';
                      result:=@str[1];
                      end;
                      ]
                      Ответить
                      • показать все, что скрытоSIG SEGV!

                        ░░░░░░░░░░░▄▄▄▄▄
                        ░░░░░░░▄▄█████████▄▄
                        ░░░░▄▀▀▀▀█▀▀▀▀▀▀█████▄
                        ░░▄██████░░░░░░░░░░░▀██
                        ░▐██████▌░░░░░░░░░░░░░▐▌
                        ░███████▌░░░░░░░░░░░░░░█
                        ▐████████░░░░░░░░░░░░░░░█
                        ▐██████▌░░░░░▄▀▀▀▀▀▄░▀░▄▄▌
                        ░█▀▀███▀░░░░░░▄▀█▀░░░▐▄▄▄▌
                        ▐░▌▀▄░░░░░░░░░░▄▄▄▀░░░▌▀░▌
                        ░▌▐░░▌░░░░░░░░░░░▀░░░░▐░▐
                        ░▐░▀▄▐░░░░░░░░░░░▌▌░▄▄░▐░▌
                        ░░▀█░▄▀░░░░░░░░░▐░▐▄▄▄▄▀▐
                        ░░░▌▀░▐░░░░░░░░▄▀░░▀▀▀▀░▌
                        ░░░▐░░░░░░░░░▌░░░▄▀▀▀▀▄▐
                        ░░░▌░░░░░░░░░▐░░░░░▄▄░░▌
                        ░░█▀▄░░░▐░▐░░░░░░░░░░░█
                        ░█░█░▀▀▄░▌░█░░░▀▀▄▄▄▄▀
                        █░░░▀▄░░▀▀▄▄█░░░░░▄▀
                        ░░░░░░▀▄░░░░▀▀▄▄▄▀▐
                        █░░░░░░░▀▄░░░░░▐░▌▐
                        ░█░░░░░░░░▀▄░░░▌░▐▌▐
                        ░░█░░░░░░░░░█░▐░▄▄▌░█▀▄
                        ░░░█░░░░░░░░░█▌▐░▄▐░░▀▄▀▀▄▄
                        ░░░░█░░░░░░░░░▀▄░░▐░░░▀▄░░░▀▀▄▄
                        ░░░░░▀▄░▄▀█░░░░░█░░▌░░░░▀▄░░░░░█
                        Ответить
                      • > Безопасно ли будет вернуть указатель на нее?
                        Нет конечно. Ссылки на локальные переменные нельзя возвращать.
                        Ответить
                        • показать все, что скрытоМожно, но только царям.
                          Ответить
                        • http://ideone.com/pCq5xg

                          Забавно, но @str — это ссылка на локальную переменную (на стек), а @str[1] — это ссылка на кучу, т. е. не на локальную переменную, а туда, где выделил память конструктор pwidestring.
                          Ответить
                          • Да один хер деструктор widestring'а эту память освободит и будет UB.
                            Ответить
                            • показать все, что скрытоТак можно же не удалять объект, в делфи, насколько я помню, по умолчанию GC не включен. Объект может в памяти вечно висеть (совсем по царски)
                              Ответить
                              • Дело не в GC, у там нечто типа автоматических AddRef/Release.
                                Ответить
                              • Не надо гнать пургу. Объекты создаются в куче, а локальные переменные - на стеке. Это значит, что после выхода их процедуры/функции на стеке будет пусто и указатель на переменную, возвращённый из функции, будет указывать на хуй. Глобанльную переменную не хочется пилить, а с прямым возвратом WideString эта либа не пойдёт нигде, кроме как в делфи. Печалька.
                                Ответить

    Добавить комментарий