1. JavaScript / Говнокод #23551

    +1

    1. 1
    github.com/php/php-src/commit/0e097f2c96ce31b16fa371981045f224e5a37160#diff-e0dff85f21e939e4e2a778bddb8a72d7R819

    Кто мне объяснит, как вообще работает этот PHP до сих пор, если они через строчку получают длину строки siezof'ом и при этом это ещё помогло исправить баг?

    Запостил: d_fomenok, 18 Ноября 2017

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

    • это нормальный код в ц и сетях.

      с другой стороны, более важный вопрос: сколько лет этому багу, и они вообще тестируют это?

      ЗЫ честно говоря ожидал что там будет какая RFC (2)822 парсинг библиотечка подключена.
      Ответить
    • Но ведь работает же:
      https://ideone.com/sw7g7N

      А что опечатались — ну с кем не бывает?
      Ответить
      • Почему оно работает, кстати? Потому что строковой литерал это const char[] а не char*?

        Но он тогда вернет на 1 больше же, нуль же в конце
        Ответить
        • > Но он тогда вернет на 1 больше же, нуль же в конце
          А там как раз для этого сделали -1
          Ответить
      • зы:
        там "sizeof("Content-Length:")-1)" по всему коду
        это, типа, чтобы размер строки узнавать шустро? Хотя макрос бы сделали
        Ответить
    • У них проблема не столько в sizeof, столько в том, что они проверяют только N первых байтов и не проверяют длину. Например, если в качестве значения вместо "Chunked" будет "Chunked100500", то "PHP" этого не заметит.
      Ответить
      • # "Chunked" будет "Chunked100500"

        Если я не ошибаюсь, там ещё и двоеточие включается

        PS. Перечитал. Я перепутал, там в других случаях есть, но не в этом
        Ответить
      • На самом деле ясно, зачем так сделано - в Transfer-Encoding может быть перечислено несколько методов кодирования, но, блять, Chunked двлеко не обязательно будет первым.
        https://tools.ietf.org/html/rfc7230#section-3.3.1
        Ответить
        • А я всё голову ломал, почему авторы серьёзных библиотек используют внешние расширения типа "CURL" при наличии встроенных средств для работы с "HTTP".
          Ответить
          • i am a very baaaad boy
            Ответить
          • Справедливости ради : ни в J2SE ни в Py ни даже в Ruby нету в комплекте действительно годного и удобного HTTP клиента.

            Просто именно у PHP придумали юзать обертку вокруг курла. Но это вообще философия PHP: вместо написанных на ПХП либ они юзают тонкие обертки вокруг готовых
            Ответить
    • Структуры данных, отличные от массивов — это слишком высокий уровень обсракции для погромистов на пухапе
      struct StringView {
        const char* data;
        size_t size;
      };
      Ответить
      • Они просто Цари, а к Царей любая структура данных это char* data.
        Ответить
    • Говно, и дураку понятно, что нужно так:
      #define CONTENT_LENGTH_T_PAAMAYIM_NEKUDOTAYIM "Content-Length:"
      #define CONTENT_LENGTH_T_PAAMAYIM_NEKUDOTAYIM_SIZE (sizeof(CONTENT_LENGTH_T_PAAMAYIM_NEKUDOTAYIM) - 1)
      // ...
      strncasecmp(http_header_line, CONTENT_LENGTH_T_PAAMAYIM_NEKUDOTAYIM, CONTENT_LENGTH_T_PAAMAYIM_NEKUDOTAYIM_SIZE );
      Ответить
      • #define STRING_WITH_LEN(S) S, sizeof(S)-1
        //...
        strncasecmp(http_header_line, STRING_WITH_LEN("Content-Length:"));
        Ответить
      • «PAAMAYIM» означает «двойное». Тут должно быть просто «NEKUDOTAYIM» — «двоеточие».
        Ответить
    • недорос ты ещё понять это
      Ответить

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