Перейти к содержанию

HTTP из PHP плагина на r24 и r25

Редакция 2026-11-03. HTTP-запросы из PHP плагина на r24 и r25: cURL и curl_multi, потоки, CA-бандл, локальные URL, подмена хостов lcreg, wget. Перенесено без переписывания из guide/php-environment.md §3.6–§3.7; источники и оговорки — во вступлении той же главы, остальное о среде PHP — там же. Дополнение (2026-11-03): проверка на устройстве (tv188b 261021_0117_r25, php_server тестового плагина test_plugin13, каждый случай — один прогон) — порт и хост у curl_setopt(CURLOPT_URL) и curl_init(url) к 127.0.0.1/localhost, падение curl_multi_getcontent и обход через CURLOPT_FILE (§3.6).

Коротко: вопрос → ответ

Вопрос Ответ Где
Какой cURL? r25: 7.67.0 с OpenSSL 1.0.1u (устройство r25)1; части констант нет (устройство r25)2 §3.6; константы — php-environment.md §4.2
Какой CA-бандл? /firmware/certs/ca-bundle.crt (устройство r25)3 данных Mozilla 2022 года (код r22, r24, r25)4 §3.6
Есть ли wget? r25: $FS_PREFIX/bin/wget, ссылка на BusyBox (устройство r25)5; в одном прогоне вызов по имени к /ping — ok и rc=0 (устройство r25)6, полным путём — rc=126 (устройство r25)7 §3.6
Почему curl_multi роняет php_server? tv188b r25, один прогон: SIGSEGV в zif_curl_multi_getcontent (устройство r25)8, затем PHP_CALL_FAILED (устройство r25)9; с CURLOPT_FILE без curl_multi_getcontent шаг прошёл (устройство r25)10 §3.6
Подставляет ли PHP порт в http://127.0.0.1/cgi-bin/plugins/…? tv188b r25, один прогон: curl_setopt(CURLOPT_URL) — да, :80 (устройство r25)11; curl_init(url) — нет (устройство r25)12; CGI порт не видит (устройство r25)13 §3.6

Задачи

3.6. HTTP из PHP: cURL, потоки, CA-бандл, локальные URL, wget

Версии. На r25 curl_version() даёт 7.67.0, OpenSSL/1.0.1u, zlib 1.2.11, arm-unknown-linux-androideabi (устройство r25)1; строка libcurl/7.67.0 есть в библиотеках tv188b r22, r24, r25 и tv175u r24 (код r22, r24, r25)14. Наборы имён curl_multi_* и CURLOPT_* в libphp5.so совпадают у всех пяти сборок (код r22, r24, r25)15. Каких констант нет — php-environment.md §4.2.

Хелпер прошивки. HD::http_get_document r24 по умолчанию отключает проверку TLS, следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*, а опции вызывающего применяет поверх (код r24)16. Любой код, кроме 200, и ошибка curl дают DuneCurlException (код r24)17; URL и POST-поля идут в лог, пока не передан $silent=true (код r24)18, а в r25 сообщения лога изменены (код r25)19. В tv188b r22 файла dunelib/utils.php нет (код r22, r24)20. Проверка TLS в хелпере — BUG-003, свои копии хелпера в плагинах — §9.1.

CA-бандл. Файл /firmware/certs/ca-bundle.crt одинаков в пяти сборках (код r22, r24, r25)21 и доступен из обоих видов PHP на r25 (устройство r25)3. В r24 его подставляет HD::http_get_document при CURLOPT_SSL_VERIFYPEER=true для https (код r24)22. Что он значит для реальных сайтов (прогон на 19 хостах, errno 60 у www.ssl.com, errno 35 у kodikapi.com), — в BUG-001.

curl_multi. На r25 curl_multi на 4 хендла к httpd самого плеера доходит до curl_multi_info_read со всеми сообщениями, а затем php-cgi падает с кодом 139 (устройство r25)23, а в php_server операция заканчивается PHP_CALL_FAILED (устройство r25)24 и диалогом «Ошибка приложения» (устройство r25)25. Запись — BUG-002.

В прогоне на tv188b r25 curl_multi на четырёх HTTP-хендлах к компьютеру записал четыре info_read msg=1 result=0 и строку после curl_multi_info_read (устройство r25)26. Шаг не записал end за 25 с: отчёт обрывается после curl_multi_info_read, без h0 и curl_multi_close прошёл, а заголовок сбора уже показывает php_server(test_plugin11)=нет (устройство r25)27.

Повтор при проверке на устройстве (tv188b r25, чистый php_server, метки до и после каждого вызова, один прогон) сдвинул место обрыва (устройство r25)28. После curl_multi_exec(run=0) пять вызовов curl_multi_info_read вернули четыре пары msg=1/result=0, затем false (устройство r25)29. curl_getinfo(h0, CURLINFO_HTTP_CODE) вернул 200, а последняя строка отчёта — «перед curl_multi_getcontent h0», без метки после этого вызова (устройство r25)30. Оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился (устройство r25)31. HTTP-сервер компьютера при этом зарегистрировал все четыре GET /ping?multi=0..3 и ответил на каждый статусом 200 (устройство r25)32. Причина обрыва этими прогонами не установлена; гипотеза по коду и другие цели — §7.

Проверка на устройстве (tv188b r25, php_server, по одному прогону каждого варианта) снял сам сбой. С CURLOPT_RETURNTRANSFER после curl_multi_info_read (четыре msg=1 result=0) последняя метка — «перед curl_multi_getcontent h0», и php_server упал с SIGSEGV (SEGV_MAPERR, fault addr 0x70747490); кадр #00 — libphp5.so zif_curl_multi_getcontent+116 (pc 0010e5d0), tombstone записан (устройство r25)8. Оболочка получила EOF от PHP-сервера, записала «op 5 failed», PHP_CALL_FAILED и «[handle_user_input] Failed.», а php_server тестового плагина после шага не было (устройство r25)9. Тот же curl_multi на четырёх хендлах, но с CURLOPT_FILE и без curl_multi_getcontent, прошёл до конца: curl_getinfo вернул 200 у каждого хендла, файлы multi_0..3.out — по 3 байта, метка «после curl_multi_close» записана, php_server после шага жив, в logcat -b crash записей нет (устройство r25)10. Практически: тело ответа curl_multi на r25 пишите в файл через CURLOPT_FILE и не вызывайте curl_multi_getcontent — в этом прогоне так сбоя не было (устройство r25)33. Что именно читает функция в точке падения, — гипотезы в §7.

Локальные URL. На tv188b r25 HD_HTTP_LOCAL_PORT = 80 в php_server (устройство r25)34, порт 80 слушает httpd (устройство r25)35; в APK r24 по коду — 11080 (код r24)36. Поэтому URL своего CGI лучше брать из plugin_cgi_url: это шаблон с портом (код r24) (код r24)37, на r25 с явным :80 (устройство r25)38. Запросы изнутри плеера к http://127.0.0.1/… и http://127.0.0.1:80/… работают (устройство r25)39.

В URL-ветви curl_setopt строка идёт через HTTP-помощник: r25 (код r25)40, r24 (код r24)41. По коду r24 он при заданной HD_HTTP_LOCAL_PORT заменяет http://127.0.0.1/cgi-bin/plugins/ и http://localhost/cgi-bin/plugins/ на http://127.0.0.1:<порт>/cgi-bin/plugins/ (код r24)42. В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс http://localhost/cgi-bin/plugins/ на http://127.0.0.1:<HD_HTTP_LOCAL_PORT>/cgi-bin/plugins/, сохраняя хвост URL (код r25)43, и тем же кодом — префикс без порта http://127.0.0.1/cgi-bin/plugins/ (код r25)44. Без HD_HTTP_LOCAL_PORT, а также для http://-URL с другим хостом или путём порт не подставляется и URL уходит в _php_apply_lcreg_to_http (§3.7); URL не на http:// возвращается без обработки (код r25)45. URL, переданный прямо в curl_init, этот помощник на r25 минует: у этих двух точек входа разные маршруты обработки URL (код r25)46.

HTTP_HOST зависит от способа задать URL (tv188b r25, php_server). При проверке на устройстве (один прогон) curl_setopt(CURLOPT_URL, 'http://localhost/cgi-bin/plugins/test_plugin11/host.sh') привёл к HTTP_HOST=127.0.0.1 в CGI (устройство r25)47, а curl_init с тем же URL — к HTTP_HOST=localhost (устройство r25)48; curl_error оба раза пуст (устройство r25)49. Более ранний проверка на устройстве испытала только curl_init($u) (код r25)50 при HD_HTTP_LOCAL_PORT=80 (устройство r25)51: запрос php_server к http://localhost/cgi-bin/plugins/test_plugin6/ping.sh пришёл с HTTP_HOST=localhost, а к http://127.0.0.1:80/cgi-bin/plugins/test_plugin6/ping.sh — с HTTP_HOST=127.0.0.1 (устройство r25)52; ещё две такие же пары в том же запросе лог записал без указания, из php-cgi или из php_server они пришли (устройство r25)53. file_get_contents к URL вида http://localhost/cgi-bin/plugins/<p>/… пришёл с HTTP_HOST=127.0.0.1, а curl к тому же URL (в тестовом плагине — curl_init($u)) — с localhost (устройство r25)54. Читая HTTP_HOST в CGI, сначала смотрите, каким вызовом задан URL.

Порт и хост по способу задать URL (tv188b r25, php_server, один прогон). С PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/test_plugin13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», и CURLINFO_EFFECTIVE_URL — тот же URL с :80 (устройство r25)55. Для http://localhost/cgi-bin/plugins/… curl_setopt дал ту же замену на http://127.0.0.1:80/…, и CGI увидел HTTP_HOST=127.0.0.1 (устройство r25)56. curl_init(url) для обоих URL замены не показал: CURLINFO_EFFECTIVE_URL остался исходным (без :80, localhost не заменён), CGI для localhost увидел HTTP_HOST=localhost, а строки «=H=>» на четыре запроса шага были только от двух curl_setopt (устройство r25)12. Код r25 этих двух путей — в начале абзаца «Локальные URL» выше. Сам CGI host.sh под busybox httpd во всех четырёх запросах видел пустые SERVER_PORT и SERVER_NAME и HTTP_HOST без порта, в том числе при effective_url с :80: по CGI подстановку порта не видно (устройство r25)13. Проверять её надо по CURLINFO_EFFECTIVE_URL или строкам «=H=>» (устройство r25)57. Что осталось непроверенным о других входах — §7.

Перед curl_easy_perform в r25 curl_exec для хоста, который не localhost и не разрешается в 127.x или ::1, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote (код r25)58; см. §7.

wget. На r25 из php_server команда wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 вернула начало XML (устройство r25)59. Та же команда с $FS_PREFIX/bin/wget в том же прогоне вернула пустой вывод, причина не установлена (устройство r25)60. Код выхода [exit 0] в обоих случаях — от head, а не от wget (устройство r25)61. Практический вывод: вызывать wget по имени, а успех проверять по выводу, а не по коду конвейера; остальное — см. §7.

В отдельном прогоне (tv188b r25, php_server) which wget показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so, а вызов по имени к /ping компьютера вернул ok и rc=0 (устройство r25)6. Прямой вызов этого пути и вызов sh с тем же путём оба вернули rc=126 и cannot execute binary file (устройство r25)7; причину claim не называет, и пустой вывод из абзаца выше этот прогон не объясняет. По HTTPS wget по имени загрузил https://www.ssl.com/ в /dev/null с rc=0 и предупреждением TLS certificate validation not implemented (устройство r25)62, тогда как у cURL к этому хосту при включённой проверке — errno 60 (устройство r25)63.

3.7. Подмена хостов lcreg в HTTP-запросах (r25)

В libphp5.so r25 HTTP-помощник вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http://-URL, не попавшего под CGI-подстановку (код r25)64; в r24 этого вызова нет (код r24)65. Настройки читаются из $FS_PREFIX/config/lcreg.txt и $FS_PREFIX/config/lcreg_pairs.txt (код r25)66.

Первая строка lcreg.txt: 0 — встроенная таблица lcreg_ru_pairs, 1 — lcreg_pairs.txt, а ошибка чтения или другое значение — lcreg_kind=-1 (код r25)67, при котором замена не ищется (код r25)68. Строка пользовательской таблицы — хост : замена, с точным разделителем : (код r25)69, не больше 1024 пар (код r25)70. Повторного чтения из состояний −1, 0 и 1 функция инициализации не запускает (код r25)71.

Хост сравнивается по точной длине и с учётом регистра (код r25)72; схема, userinfo, порт и путь копируются из исходного URL (код r25)73. При успешной замене оба URL печатаются через printf без проверки PHP_DEBUG (код r25)74.

В прогоне на tv188b r25 ls и cat файла /data/data/com.dunehd.app/config/lcreg.txt вернули No such file or directory (устройство r25)75. Работу lcreg на устройстве этот прогон не показывает — см. §7.

Расхождения

  • HTTP_HOST у curl к localhost на tv188b r25. Наблюдение с file_get_contents заключает, что localhost заменяется на 127.0.0.1 в потоковой обёртке http, «но не в curl»; curl в этом тестовом плагине задан через curl_init($u) (устройство r25)54. curl_setopt(CURLOPT_URL) с тем же видом URL при проверке на устройстве дал HTTP_HOST=127.0.0.1 (устройство r25)47, curl_init — localhost (устройство r25)48. Стороны связаны как related (разный способ задать URL), conflicts_with нет: вывод «не в curl» относится только к curl_init(url) (§3.6). При проверке на устройстве то же разделение повторилось: curl_setopt — HTTP_HOST=127.0.0.1 (устройство r25)56, curl_init — HTTP_HOST=localhost (устройство r25)12.

Не проверено

Гипотезы (inference) и disputed; кандидаты на проверку на устройстве. Гипотезы о жизни php_server и операциях — guide/plugin-operations.md, о CA-бандле — guide/firmware-bugs.md и строки ниже.

Утверждение Статус Claim
Наблюдение проверки на устройстве (curl_setopt(CURLOPT_URL) с http://localhost/cgi-bin/plugins/…, HD_HTTP_LOCAL_PORT=80 → HTTP_HOST=127.0.0.1, REQUEST_URI сохранён) согласуется с заменой префикса localhost по коду r25 (§3.6); порт в ответе CGI не виден (SERVER_PORT пуст), поэтому подстановку именно порта оно не подтверждает. Порт :80 при проверке на устройстве показали строки «=H=>» и effective_url (§3.6) (устройство r25)11 inference (вывод r25)76
Вероятная причина обрыва curl_multi проверки на устройстве около curl_multi_getcontent (§3.6) — несогласованное использование поля handle+0x16c в r25: сохранённый URL может читаться как указатель на структуру буфера. Верификатор: адрес сбоя проверки на устройстве с гипотезой согласуется, но поле +0x16c лог не показывает; нужна проверка по листингу zif_curl_multi_getcontent inference, disputed (вывод r25)77
Регистр r3 = 0x70747468 в момент падения проверки на устройстве — байты ASCII «http», а fault addr = r3 + 0x28: вероятно, zif_curl_multi_getcontent разыменовал как указатель байты строки URL, что согласуется с гипотезой строкой выше inference (вывод r25)78
Программа плагина, запущенная по абсолютному пути вне /firmware/bin/ и /firmware_ext/php/, в APK запускается через sh; связаны ли с этим пустой вывод $FS_PREFIX/bin/wget (устройство r25)60 и rc=126 при вызове полным путём и через sh на r25 (устройство r25)7, claims не говорят inference (вывод r24)79
Запросы к http://127.0.0.1/cgi-bin/plugins/… в APK получают порт через CURLOPT_URL и потоки inference (вывод r24)80
На tv188b r25 разница между полным бандлом и бандлом из одного корня означает, что cURL в php_server учитывает CURLOPT_CAINFO inference (вывод r25)81
На tv188b r25 истечение Entrust 2026-11-27 не изменит результат для 19 проверенных хостов inference (вывод r25)82
На tv188b r25 lcreg подменяет хосты Dune HD их парой r2.<хост> inference (вывод r25)83
В плагине remote-control HTTP_RAW_POST_DATA в CGI может быть пуст: в его php.ini нет always_populate_raw_post_data inference (вывод)84

В базе нет данных о следующем:

  • HTTP_HOST и порт при curl_setopt(CURLOPT_URL) и curl_init($url) из php-cgi в CGI плагина (проверка на устройстве проверила их из php_server, §3.6); процесс без HD_HTTP_LOCAL_PORT и порт не 80; что делает _php_apply_lcreg_to_http при таких входах; окружение php-cgi — один прогон (php-environment.md §4.1);
  • печатает ли PHP_DEBUG=1 строки -C-> EEE о замене команд на 261021_0117_r25 и других прошивках: на 261101_0347_r25 в одном прогоне — да (устройство r25)85 (php-environment.md §3.11), печать URL — §3.6; работает ли lcreg на устройстве и действует ли при отсутствии lcreg.txt (устройство r25)75 ветка ошибки чтения из кода (код r25)67;
  • причина пустого вывода $FS_PREFIX/bin/wget и rc=126 при вызове полным путём; HTTPS через wget к другим хостам;
  • какое поле читает zif_curl_multi_getcontent на +116 (сигнал и кадр сбоя сняты при проверке на устройстве, §3.6); падает ли curl_multi_getcontent с одним хендлом и при curl_multi к самому плееру; curl_multi к внешним хостам на r25 и на других прошивках; что делает _php_curl_opensocket_remote; определены ли константы php-environment.md §4.2 на r24 и r22.

  1. fw-tv188b-261021-0117-r25.c249 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi curl_version() сообщает version 7.67.0, ssl_version OpenSSL/1.0.1u, libz_version 1.2.11, host arm-unknown-linux-androideabi. ↩↩

  2. fw-tv188b-261021-0117-r25.c250 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в php_server и php-cgi не определены константы CURLOPT_ACCEPT_ENCODING, CURLOPT_RESOLVE, CURL_SSLVERSION_TLSv1_2, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_TCP_KEEPALIVE, CURLMOPT_PIPELINING и CURLMOPT_MAXCONNECTS; CURLOPT_ENCODING (10102), CURLOPT_SSLVERSION, CURLOPT_CAINFO, CURLOPT_TIMEOUT_MS, CURLOPT_CONNECTTIMEOUT_MS, CURLOPT_NOSIGNAL и CURLOPT_IPRESOLVE определены. ↩

  3. fw-tv188b-261021-0117-r25.c251 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из php_server и php-cgi файл /firmware/certs/ca-bundle.crt доступен (is_file true; размер 227282, md5 e9dc50a63d76d3c88baa24a4374c4542), как и $FS_PREFIX/firmware/certs/ca-bundle.crt; в нём 143 PEM-блока сертификатов. ↩↩

  4. fw-tv188b-261021-0117-r25--libphp5.c037 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Заголовки CA-бандлов пяти исследованных сборок датируют данные Mozilla 11 октября 2022 года. ↩

    • fw-tv188b-261021-0117-r25.c350 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команды тестового плагина из php_server (uid 1000) дают FS_PREFIX=/data/data/com.dunehd.app; which wget и command -v wget возвращают /data/data/com.dunehd.app/bin/wget.
    • fw-tv188b-261021-0117-r25.c351 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 $FS_PREFIX/bin/wget — симлинк на $FS_PREFIX/lib/libxxx_busybox.so; /system/bin/libxxx_busybox.so — отдельный файл root:shell размером 987728 байт.

    ↩

  5. fw-tv188b-261021-0117-r25--libphp5.c073 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве which wget из php_server показал /data/data/com.dunehd.app/bin/wget — ссылку на libxxx_busybox.so; вызов по имени wget к /ping компьютера вернул ok и rc=0. ↩↩

  6. fw-tv188b-261021-0117-r25--libphp5.c074 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве прямой вызов /data/data/com.dunehd.app/bin/wget и вызов sh с тем же путём из php_server оба вернули rc=126 и cannot execute binary file. ↩↩↩

  7. fw-tv188b-261021-0117-r25--libphp5--curl-http.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_multi с RETURNTRANSFER: после curl_multi_info_read (четыре msg=1 result=0) последняя метка — «перед curl_multi_getcontent h0»; php_server 23156 упал с SIGSEGV (SEGV_MAPERR, fault addr 0x70747490), кадр #00 — libphp5.so zif_curl_multi_getcontent+116 (pc 0010e5d0), tombstone записан (один прогон). ↩↩

  8. fw-tv188b-261021-0117-r25--libphp5--curl-http.c042 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве после падения php_server в curl_multi_getcontent оболочка получила EOF от PHP-сервера, записала «op 5 failed», PHP_CALL_FAILED и «[handle_user_input] Failed.»; php_server тестового плагина после шага не было (один прогон). ↩↩

  9. fw-tv188b-261021-0117-r25--libphp5--curl-http.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_multi с четырьмя хендлами и CURLOPT_FILE без curl_multi_getcontent прошёл до конца: curl_getinfo вернул 200 у каждого, файлы multi_0..3.out по 3 байта, метка «после curl_multi_close», php_server после шага жив, в logcat -b crash за случай записей нет (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве с PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/test_plugin13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», а CURLINFO_EFFECTIVE_URL — тот же URL с :80 (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве с PHP_DEBUG=1 curl_setopt(CURLOPT_URL, http://localhost/cgi-bin/plugins/test_plugin13/host.sh) дал «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», CURLINFO_EFFECTIVE_URL с 127.0.0.1:80, а CGI увидел HTTP_HOST=127.0.0.1 (один прогон).

    ↩↩

  10. fw-tv188b-261021-0117-r25--libphp5--curl-http.c038 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_init(url) для http://127.0.0.1/… и http://localhost/cgi-bin/plugins/test_plugin13/host.sh замены не показал: CURLINFO_EFFECTIVE_URL остался исходным (без :80, localhost не заменён), CGI для localhost увидел HTTP_HOST=localhost, и строк «=H=>» на четыре запроса шага было только две пары — от двух curl_setopt (один прогон). ↩↩↩

  11. fw-tv188b-261021-0117-r25--libphp5--curl-http.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве CGI host.sh под busybox httpd во всех четырёх запросах к /cgi-bin/plugins/ видел пустые SERVER_PORT и SERVER_NAME и HTTP_HOST без порта — и при effective_url с :80; подстановку порта по CGI не видно (один прогон). ↩↩

  12. fw-tv188b-261021-0117-r25--libphp5.c026 · code · android-dune-fw; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24 · В strings библиотек libcurl сборок tv188b r22, r24, r25 и tv175u r24 присутствует libcurl/7.67.0. ↩

  13. fw-tv188b-261021-0117-r25--libphp5.c028 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · Наборы имён curl_multi_* (12) и CURLOPT_* (111) в strings libphp5.so совпадают у всех пяти исследованных сборок. ↩

  14. fw-tv188b-260827-0003-r24--php-framework.c056 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию отключает проверку TLS-сертификата (CURLOPT_SSL_VERIFYPEER=false), следует редиректам, ставит CURLOPT_ENCODING=1 и тайм-ауты из $DEFAULT_CURL_*; опции вызывающего применяются поверх ↩

  15. fw-tv188b-260827-0003-r24--php-framework.c058 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document бросает DuneCurlException при ошибке curl и при любом HTTP-коде, кроме 200 (включая 301/302/304); при ошибке curl создаёт флаг /tmp/run/network_monitor/force_check_on_error ↩

  16. fw-tv188b-260827-0003-r24--php-framework.c059 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · HD::http_get_document по умолчанию пишет в лог через hd_print URL, POST-поля и итог запроса; параметр $silent=true это отключает ↩

  17. fw-tv188b-261021-0117-r25.c023 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · HD::http_get_document в r25 пишет в лог « http <метод>: » (метод — CURLOPT_CUSTOMREQUEST, иначе POST при CURLOPT_POSTFIELDS, иначе GET) и « http DATA: …» вместо «HTTP fetching»/«HTTP POST fields»; сообщения об ошибках — в нижнем регистре («http request failed (код)») ↩

  18. fw-tv188b-260827-0003-r24--php-framework.c082 · code · tv188b, tv175u, android-dune-fw; прошивка 240619_0210_r22, 250815_1012_r22, 260724_0207_r24, 260827_0003_r24 · bootstrap.php, dune_config.php, dune_plugin.php и dunelib/dune_countries.php одинаковы (sha256) в tv175u 240619_0210_r22, tv188b 250815_1012_r22 и r24-прошивках; dunelib/config_utils, dune_languages, expr, utils в r22-прошивках отсутствуют ↩

  19. fw-tv188b-261021-0117-r25--libphp5.c036 · code · android-dune-fw, android-atv; прошивка 261021_0117_r25, 260827_0003_r24, 250815_1012_r22, 260724_0207_r24, 1.0.1-1000-260724_0207_r24 · CA-бандлы всех пяти исследованных сборок совпадают по SHA-256 722be2869ed2c2a949e5edb75b030f1e737e869ca8e8f70bc8d876dd93227ead. ↩

  20. fw-tv188b-260827-0003-r24--php-framework.c057 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Если вызывающий передал CURLOPT_SSL_VERIFYPEER=true для https-URL, HD::http_get_document подставляет CURLOPT_CAINFO=/firmware/certs/ca-bundle.crt ↩

  21. fw-tv188b-261021-0117-r25.c234 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-скрипт CGI плагина (php-cgi через CGI-обёртку), выполнивший curl_multi на 4 хендла к httpd самого плеера (http://127.0.0.1/plugins/…, http://127.0.0.1:80/cgi-bin/plugins/…, http://localhost/cgi-bin/plugins/…), доходит до curl_multi_info_read и получает все 4 сообщения с msg=1 result=0, после чего php-cgi завершается с кодом 139 и в /tmp/dune_apk_cgi_err.log появляется «Segmentation fault»; повторный запуск дал то же самое. ↩

  22. fw-tv188b-261021-0117-r25.c235 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 тот же тестовый плагин curl_multi (4 хендла к httpd плеера) в php_server PHP-плагина (операция handle_user_input) доходит до curl_multi_info_read со всеми 4 сообщениями msg=1 result=0; результата операция не возвращает: через ~0,25 с после её начала оболочка пишет в shell.log «[test_plugin6] [php] E: op 11 failed (read status: 2).», «shutting down...», «stopped.» и «Error: operation returned PHP_CALL_FAILED.». ↩

  23. fw-tv188b-261021-0117-r25.c236 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после сбоя операции handle_user_input php_server с «op 11 failed (read status: 2)» и PHP_CALL_FAILED оболочка пишет «FATAL ERROR detected (msg = Ошибка приложения)» и показывает диалог «Ошибка приложения / Произошла ошибка. Приложение будет закрыто.» с кнопкой OK; после закрытия плеер не завис. ↩

  24. fw-tv188b-261021-0117-r25--libphp5--curl-http.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_multi на четырёх HTTP-хендлах к компьютеру записал четыре info_read msg=1 result=0 и строку после curl_multi_info_read. ↩

  25. fw-tv188b-261021-0117-r25--libphp5--curl-http.c026 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве шаг multi не записал end за 25 с; сохранённый отчёт обрывается после curl_multi_info_read, без h0 и curl_multi_close прошёл, а заголовок сбора уже показывает php_server(test_plugin11)=нет. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c026 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве шаг multi не записал end за 25 с; сохранённый отчёт обрывается после curl_multi_info_read, без h0 и curl_multi_close прошёл, а заголовок сбора уже показывает php_server(test_plugin11)=нет.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi проверки на устройстве curl_getinfo(h0, CURLINFO_HTTP_CODE) записал возврат 200; последняя строка отчёта — «перед curl_multi_getcontent h0», без последующей метки этого вызова.

    ↩

  26. fw-tv188b-261021-0117-r25--libphp5--curl-http.c027 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi проверки на устройстве на четырёх HTTP-хендлах к компьютеру после curl_multi_exec(run=0) пять вызовов curl_multi_info_read вернули четыре пары msg=1/result=0, затем false; каждый вызов имеет метки до и после. ↩

  27. fw-tv188b-261021-0117-r25--libphp5--curl-http.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi проверки на устройстве curl_getinfo(h0, CURLINFO_HTTP_CODE) записал возврат 200; последняя строка отчёта — «перед curl_multi_getcontent h0», без последующей метки этого вызова. ↩

  28. fw-tv188b-261021-0117-r25--libphp5--curl-http.c029 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi проверки на устройстве оболочка получила EOF от PHP-сервера, записала PHP_CALL_FAILED и stopped; end multi за 25 с не появился, а при сборе php_server тестового плагина уже не найден. ↩

  29. fw-tv188b-261021-0117-r25--libphp5--curl-http.c030 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В multi проверки на устройстве HTTP-сервер компьютера зарегистрировал все четыре GET /ping?multi=0..3 и ответил на каждый статусом 200, отдав по 3 байта. ↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c040 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_multi с четырьмя хендлами и CURLOPT_FILE без curl_multi_getcontent прошёл до конца: curl_getinfo вернул 200 у каждого, файлы multi_0..3.out по 3 байта, метка «после curl_multi_close», php_server после шага жив, в logcat -b crash за случай записей нет (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_multi с RETURNTRANSFER: после curl_multi_info_read (четыре msg=1 result=0) последняя метка — «перед curl_multi_getcontent h0»; php_server 23156 упал с SIGSEGV (SEGV_MAPERR, fault addr 0x70747490), кадр #00 — libphp5.so zif_curl_multi_getcontent+116 (pc 0010e5d0), tombstone записан (один прогон).

    ↩

    • fw-tv188b-261021-0117-r25.c361 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина test_plugin8 (pid 3005, ppid 2449, uid 1000) HD_HTTP_LOCAL_PORT=80.
    • fw-tv188b-261021-0117-r25--libphp5.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве /proc/self/environ php_server test_plugin11 содержал PHP_PROC_OPEN_SH=/data/data/com.dunehd.app/bin/sh, FS_PREFIX=/data/data/com.dunehd.app, TMPDIR=/data/data/com.dunehd.app/tmp, FS_BIN_PREFIX=/data/data/com.dunehd.app и HD_HTTP_LOCAL_PORT=80.

    ↩

  30. fw-tv188b-261021-0117-r25.c093 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 TCP-порт 80 (*:80) слушает процесс httpd. ↩

  31. fw-apk-260724-0207-r24--data-deploy.c033 · code · android-atv; прошивка 260724_0207_r24 · runDaemonProcess задаёт HD_HTTP_LOCAL_PORT=11080 (константа HDConfig.HD_HTTP_LOCAL_PORT, подставлена в байткод как const/16 11080) ↩

  32. fw-tv188b-260827-0003-r24--plugin-loader.c031 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · php_plugin.c: в libduneshell.so рядом стоят имена install_dir_path, tmp_dir_path, data_dir_path, plugin_www_url с шаблоном http://127.0.0.1:%d/plugins/%s/ и plugin_cgi_url с шаблоном http://127.0.0.1:%d/cgi-bin/plugins/%s/, а также вызов DunePluginFw::$instance->call_plugin ↩

  33. fw-tv188b-261021-0117-r25.c289 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у test_plugin5 plugin_www_url = 'http://127.0.0.1:80/plugins/test_plugin5/', plugin_cgi_url = 'http://127.0.0.1:80/cgi-bin/plugins/test_plugin5/' — с явным портом 80. ↩

    • fw-tv188b-261021-0117-r25.c157 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 из PHP внутри плеера (php-cgi в CGI плагина) curl-запрос к http://127.0.0.1/plugins/test_plugin6/index.txt вернул HTTP 200 и содержимое www/index.txt.
    • fw-tv188b-261021-0117-r25.c158 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 CGI плагина исполняется и по запросам изнутри плеера: curl из php-cgi (CGI test_plugin6) и из php_server плагина test_plugin6 к http://127.0.0.1:80/cgi-bin/plugins/test_plugin6/ping.sh и http://localhost/cgi-bin/plugins/test_plugin6/ping.sh запустил ping.sh с REMOTE_ADDR=[::ffff:127.0.0.1].

    ↩

  34. fw-tv188b-261021-0117-r25--libphp5--curl-http.c002 · code · android-dune-fw; прошивка 261021_0117_r25 · В URL-ветви опции 0x2712 обработчик _php_curl_setopt r25 передаёт строку через _php_add_fs_prefix_to_http перед php_curl_option_url.isra.7. ↩

  35. fw-tv188b-261021-0117-r25--libphp5--curl-http.c018 · code · android-dune-fw; прошивка 260827_0003_r24 · В URL-ветви опции 0x2712 обработчик _php_curl_setopt r24 передаёт строку через _php_add_http_port перед php_curl_option_url.isra.6. ↩

  36. fw-tv188b-261021-0117-r25--libphp5--curl-http.c020 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс http://127.0.0.1/cgi-bin/plugins/ или http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ с сохранением хвоста — та же CGI-подстановка, что в r25. ↩

  37. fw-tv188b-261021-0117-r25--libphp5--curl-http.c032 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет префикс URL http://localhost/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/, сохраняя хвост URL. ↩

  38. fw-tv188b-261021-0117-r25--libphp5--curl-http.c033 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http при заданной HD_HTTP_LOCAL_PORT заменяет и префикс без порта http://127.0.0.1/cgi-bin/plugins/ на http://127.0.0.1:/cgi-bin/plugins/ тем же кодом. ↩

  39. fw-tv188b-261021-0117-r25--libphp5--curl-http.c034 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http без HD_HTTP_LOCAL_PORT, а также для http://-URL с другим хостом или путём порт не подставляет и передаёт URL в _php_apply_lcreg_to_http; URL не на http:// возвращается без обработки. ↩

  40. fw-tv188b-261021-0117-r25--libphp5--curl-http.c016 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_init при переданном URL вызывает php_curl_option_url.isra.7 напрямую; HTTP-подстановка перед этим вызовом есть в URL-ветви _php_curl_setopt, поэтому эти две точки входа имеют разный маршрут обработки URL. ↩

  41. fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/test_plugin11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error. ↩↩

  42. fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_init(http://localhost/cgi-bin/plugins/test_plugin11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error. ↩↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c023 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_setopt(CURLOPT_URL,http://localhost/cgi-bin/plugins/test_plugin11/host.sh) из php_server привёл к CGI HTTP_HOST=127.0.0.1 и пустой curl_error.
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c024 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве curl_init(http://localhost/cgi-bin/plugins/test_plugin11/host.sh) из php_server привёл к CGI HTTP_HOST=localhost и пустой curl_error.

    ↩

  43. fw-tv188b-261021-0117-r25.c380 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Тестовый плагин проверки на устройстве (kbp6_curl_multi_report) задаёт URL каждого запроса curl_multi через curl_init($u), а не через curl_setopt(CURLOPT_URL); функцию вызывают CGI cm.php (ctx cgi) и main.php php_server (ctx php_server). ↩

  44. fw-tv188b-261021-0117-r25.c381 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в окружении php_server плагина test_plugin6 (проверка на устройстве) HD_HTTP_LOCAL_PORT=80. ↩

  45. fw-tv188b-261021-0117-r25.c378 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве php_server плагина test_plugin6 (отчёт curl_multi ctx=php_server, 15:08:30), задавший URL через curl_init($u), обратился к http://localhost/cgi-bin/plugins/test_plugin6/ping.sh?via=localhost — CGI получил HTTP_HOST=localhost; запрос к http://127.0.0.1:80/cgi-bin/plugins/test_plugin6/ping.sh?via=127.0.0.1 пришёл с HTTP_HOST=127.0.0.1. ↩

  46. fw-tv188b-261021-0117-r25.c379 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве в 15:06:43 лог ping.sh test_plugin6 записал ещё две пары запросов тестового плагина: с via=localhost — HTTP_HOST=localhost, с via=127.0.0.1 — HTTP_HOST=127.0.0.1; из какого контекста (CGI cm.php или php_server) пришла каждая пара, этот лог не записывает. ↩

  47. fw-tv188b-260827-0003-r24--plugin-loader--php-runtime.c041 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запрос из php_server функцией file_get_contents к http://localhost/cgi-bin/plugins/

    /… приходит в httpd с HTTP_HOST=127.0.0.1, а curl к тому же URL — с HTTP_HOST=localhost: localhost заменяется на 127.0.0.1 в потоковой обёртке http, но не в curl. ↩↩

  48. fw-tv188b-261021-0117-r25--libphp5--curl-http.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве с PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/test_plugin13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», а CURLINFO_EFFECTIVE_URL — тот же URL с :80 (один прогон). ↩

  49. fw-tv188b-261021-0117-r25--libphp5--curl-http.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве с PHP_DEBUG=1 curl_setopt(CURLOPT_URL, http://localhost/cgi-bin/plugins/test_plugin13/host.sh) дал «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», CURLINFO_EFFECTIVE_URL с 127.0.0.1:80, а CGI увидел HTTP_HOST=127.0.0.1 (один прогон). ↩↩

    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве с PHP_DEBUG=1 и HD_HTTP_LOCAL_PORT=80 curl_setopt(CURLOPT_URL, http://127.0.0.1/cgi-bin/plugins/test_plugin13/host.sh) дал в логе плагина «=H=> EEE orig http» с исходным URL и «repl http: http://127.0.0.1:80/cgi-bin/plugins/test_plugin13/host.sh», а CURLINFO_EFFECTIVE_URL — тот же URL с :80 (один прогон).
    • fw-tv188b-261021-0117-r25--libphp5--curl-http.c039 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве CGI host.sh под busybox httpd во всех четырёх запросах к /cgi-bin/plugins/ видел пустые SERVER_PORT и SERVER_NAME и HTTP_HOST без порта — и при effective_url с :80; подстановку порта по CGI не видно (один прогон).

    ↩

  50. fw-tv188b-261021-0117-r25--libphp5--curl-http.c022 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 zif_curl_exec перед curl_easy_perform читает сохранённый URL из поля handle +0x16c; если хост (после http:// или https://, без userinfo и порта) не localhost/localhost. и не разрешается getaddrinfo в 127.x или ::1, либо URL пуст или с другой схемой, ставит опцию 0x4ec3 с обработчиком _php_curl_opensocket_remote. ↩

  51. fw-tv188b-261021-0117-r25.c352 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команда wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) вернула начало XML-ответа <param name="protocol_version" value="6"; [exit 0] — код head в конвейере, а не wget. ↩

  52. fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена. ↩↩

    • fw-tv188b-261021-0117-r25.c352 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 команда wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) вернула начало XML-ответа <param name="protocol_version" value="6"; [exit 0] — код head в конвейере, а не wget.
    • fw-tv188b-261021-0117-r25.c353 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 вызов $FS_PREFIX/bin/wget -q -O - 'http://127.0.0.1/cgi-bin/do?cmd=status' | head -c 80 из php_server (uid 1000) в том же прогоне вернул пустой вывод, а [exit 0] — код head в конвейере; причина не установлена.

    ↩

  53. fw-tv188b-261021-0117-r25--libphp5.c075 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве wget по имени из php_server загрузил https://www.ssl.com/ в /dev/null с rc=0 и предупреждением TLS certificate validation not implemented. ↩

  54. fw-tv188b-261021-0117-r25--libphp5.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · www.ssl.com на tv188b r25 из php_server (uid 1000) с полным бандлом, без корня Entrust и только с корнем Entrust при включённой проверке TLS даёт errno 60 «self signed certificate in certificate chain»; без проверки — HTTP 200, а цепочка заканчивается самоподписанным SSL.com TLS RSA Root CA 2022. ↩

  55. fw-tv188b-261021-0117-r25--libphp5--curl-http.c004 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 _php_do_add_fs_prefix_to_http вызывает lcreg при отсутствии HD_HTTP_LOCAL_PORT либо для http:// URL, не попавшего под CGI-подстановку; при заданной HD_HTTP_LOCAL_PORT URL без префикса http:// выходит до lcreg. ↩

  56. fw-tv188b-261021-0117-r25--libphp5--curl-http.c021 · code · android-dune-fw; прошивка 260827_0003_r24 · В r24 _php_add_fs_prefix_to_http не вызывает lcreg и других функций замены хоста; при отсутствии HD_HTTP_LOCAL_PORT или несовпадении префикса URL не меняется, а печать исходного и нового URL ограждена getenv("PHP_DEBUG"). ↩

  57. fw-tv188b-261021-0117-r25--libphp5--curl-http.c006 · code · android-dune-fw; прошивка 261021_0117_r25 · Инициализация lcreg r25 читает настройки из FS_PREFIX + /config/lcreg.txt и FS_PREFIX + /config/lcreg_pairs.txt; при отсутствии FS_PREFIX использует пустой префикс. ↩

  58. fw-tv188b-261021-0117-r25--libphp5--curl-http.c007 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_kind выбирается через atoi первой строки lcreg.txt: 0 выбирает встроенную таблицу lcreg_ru_pairs, 1 читает lcreg_pairs.txt; ошибка открытия/чтения lcreg.txt, результат вне 0/1 или недоступный файл пар дают lcreg_kind=-1. ↩↩

  59. fw-tv188b-261021-0117-r25--libphp5--curl-http.c011 · code · android-dune-fw; прошивка 261021_0117_r25 · lcreg_get_replacement r25 ищет замену только при lcreg_kind>=0 и префиксе http:// либо https://, сравниваемом через strncmp с учётом регистра. ↩

  60. fw-tv188b-261021-0117-r25--libphp5--curl-http.c008 · code · android-dune-fw; прошивка 261021_0117_r25 · В режиме lcreg_kind=1 r25 принимает строки пар с точным разделителем « : »; строку без него пропускает, левую часть копирует до разделителя, правую — начиная через три байта после него, удаляя завершающий LF. ↩

  61. fw-tv188b-261021-0117-r25--libphp5--curl-http.c009 · code · android-dune-fw; прошивка 261021_0117_r25 · Чтение пользовательской таблицы lcreg r25 ограничено 1024 принятыми парами; отдельный fgets вызывается с размером 0x400. ↩

  62. fw-tv188b-261021-0117-r25--libphp5--curl-http.c010 · code · android-dune-fw; прошивка 261021_0117_r25 · В r25 lcreg_ensure_initialized вызывает lcreg_do_initialize только при lcreg_kind=-2; состояния -1, 0 и 1 не запускают повторное чтение через эту функцию. ↩

  63. fw-tv188b-261021-0117-r25--libphp5--curl-http.c012 · code · android-dune-fw; прошивка 261021_0117_r25 · Для lcreg r25 имя хоста выделяется после последнего @ перед первым / (либо концом строки) и до первого : в этой части; совпадение с таблицей требует равной длины и memcmp без изменения регистра. ↩

  64. fw-tv188b-261021-0117-r25--libphp5--curl-http.c013 · code · android-dune-fw; прошивка 261021_0117_r25 · При совпадении lcreg r25 _php_apply_lcreg_to_http создаёт новую строку из исходного префикса до хоста, замены из таблицы и исходного хвоста после хоста; схема, userinfo и хвост с портом/путём копируются из исходного URL. ↩

  65. fw-tv188b-261021-0117-r25--libphp5--curl-http.c005 · code · android-dune-fw; прошивка 261021_0117_r25 · При успешной замене lcreg функция _php_apply_lcreg_to_http r25 печатает исходный и новый URL через printf без проверки PHP_DEBUG. ↩

  66. fw-tv188b-261021-0117-r25.c377 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При проверке на устройстве ls и cat /data/data/com.dunehd.app/config/lcreg.txt вернули No such file or directory. ↩↩

  67. fw-tv188b-261021-0117-r25--libphp5--curl-http.c035 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Наблюдение проверки на устройстве (curl_setopt(CURLOPT_URL) с http://localhost/cgi-bin/plugins/…, HD_HTTP_LOCAL_PORT=80 → HTTP_HOST=127.0.0.1, REQUEST_URI сохранён) согласуется с заменой префикса localhost по c032; порт в ответе CGI не виден (SERVER_PORT пуст), поэтому подстановку именно порта оно не подтверждает. ↩

  68. fw-tv188b-261021-0117-r25--libphp5--curl-http.c031 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Вероятная причина прекращения multi проверки на устройстве около curl_multi_getcontent — несогласованное использование поля handle+0x16c в r25: сохранённый URL может интерпретироваться как указатель на структуру буфера. ↩

  69. fw-tv188b-261021-0117-r25--libphp5--curl-http.c043 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Регистр r3 = 0x70747468 в момент падения равен байтам ASCII «http» (little-endian), а fault addr = r3 + 0x28; вероятно, в zif_curl_multi_getcontent как указатель разыменованы байты строки URL — это согласуется с гипотезой c031 о несогласованном поле handle+0x16c. ↩

  70. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c013 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK программа плагина, запущенная exec/shell_exec по абсолютному пути вне /firmware/bin/ и /firmware_ext/php/ (например /flashdata/plugins/<плагин>/bin/x или $FS_PREFIX/…), запускается как «sh <путь>»: shell-скрипт так работает и без бита x, а ELF-бинарник — нет ↩

  71. fw-apk-260724-0207-r24--data-deploy--php-fs-prefix.c038 · inference · android-atv; прошивка 260724_0207_r24 · Вероятно, в APK запросы плагина к http://127.0.0.1/cgi-bin/plugins/… и http://localhost/cgi-bin/plugins/… через curl_setopt($ch, CURLOPT_URL, …) и через потоки (fopen, file_get_contents) уходят на http://127.0.0.1:/cgi-bin/plugins/… (в APK порт 11080), так что адрес без порта работает ↩

  72. fw-tv188b-261021-0117-r25--libphp5.c049 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Разница между полным бандлом и бандлом только из корня Entrust на одних и тех же 17 хостах в прогоне из php_server (uid 1000) при включённой проверке TLS означает, что PHP cURL в php_server r25 учитывает CURLOPT_CAINFO, а не только системное хранилище. ↩

  73. fw-tv188b-261021-0117-r25--libphp5.c052 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Истечение «Entrust Root Certification Authority» 2026-11-27 не должно изменить результат HTTPS для 17 из 19 хостов hosts10.txt, успешных 2026-11-02, при запросах из php_server (uid 1000): уже 2026-11-02 все они проходят проверку без этого корня. Это не прогноз для сайтов вне hosts10.txt и для двух хостов, не прошедших проверку (www.ssl.com, kodikapi.com). ↩

  74. fw-tv188b-261021-0117-r25--shell-ext--movies.c061 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · lcreg (common/mt/lcreg.c, общий для нативных библиотек) подменяет хосты Dune HD их парой r2.<хост> (в том числе dunemdb.dune-hd.com → r2.dunemdb.dune-hd.com) по настройке /config/lcreg.txt и lcreg_pairs.txt. ↩

  75. plg-dune-remote-control.c032 · inference · unknown; прошивка — · Вероятно, put/append на устройстве не работают: код читает тело POST только из $HTTP_RAW_POST_DATA, а в php.ini рядом с php-cgi нет always_populate_raw_post_data и php://input нигде не используется — тогда разбирается пустой и возвращается operation_failed. ↩

  76. fw-tv188b-261021-0117-r25--libphp5.c100 · device · tv188b, android-dune-fw; прошивка 261101_0347_r25 · При проверке на устройстве (один прогон, 261101_0347_r25) putenv("PHP_DEBUG=1") в php_server вернул true и getenv дал 1 (в /proc/self/environ переменной нет), после чего каждый exec/shell_exec с заменой пути записал в лог плагина /tmp/run/test_plugin14.log пару « -C-> EEE orig command / repl command» (6 строк на 3 вызова); «=H=>» — 0, в shell.log маркеров нет. ↩