1. Си / Говнокод #27941

    +3

    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
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    buf = malloc(8 * 1024);
    
    snprintf(buf, 8 * 1024,
         "{\n"
         "\t\"tilejson\": \"2.0.0\",\n"
         "\t\"schema\": \"xyz\",\n"
         "\t\"name\": \"%s\",\n"
         "\t\"description\": \"%s\",\n"
         "\t\"attribution\": \"%s\",\n"
         "\t\"minzoom\": %i,\n"
         "\t\"maxzoom\": %i,\n"
         "\t\"tiles\": [\n",
         tile_config->xmlname, (tile_config->description ? tile_config->description : ""), tile_config->attribution, tile_config->minzoom, tile_config->maxzoom);
    
    for (i = 0; i < tile_config->noHostnames; i++) {
        strncat(buf, "\t\t\"", 8 * 1024 - strlen(buf) - 1);
        strncat(buf, tile_config->hostnames[i], 8 * 1024 - strlen(buf) - 1);
        strncat(buf, tile_config->baseuri, 8 * 1024 - strlen(buf) - 1);
        strncat(buf, "{z}/{x}/{y}.", 8 * 1024 - strlen(buf) - 1);
        strncat(buf, tile_config->fileExtension, 8 * 1024 - strlen(buf) - 1);
        strncat(buf, "\"", 8 * 1024 - strlen(buf) - 1);
    
        if (i < tile_config->noHostnames - 1) {
            strncat(buf, ",", 8 * 1024 - strlen(buf) - 1);
        }
    
        strncat(buf, "\n", 8 * 1024 - strlen(buf) - 1);
    }
    
    strncat(buf, "\t]\n}\n", 8 * 1024 - strlen(buf) - 1);
    len = strlen(buf);
    
    /*
     * Add HTTP headers. Make this file cachable for 1 week
     */
    md5 = ap_md5_binary(r->pool, (unsigned char *)buf, len);
    apr_table_setn(r->headers_out, "ETag",
               apr_psprintf(r->pool, "\"%s\"", md5));
    ap_set_content_type(r, "application/json");
    ap_set_content_length(r, len);
    apr_table_mergen(t, "Cache-Control",
             apr_psprintf(r->pool, "max-age=%" APR_TIME_T_FMT,
                      maxAge));
    timestr = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
    apr_rfc822_date(timestr, (apr_time_from_sec(maxAge) + r->request_time));
    apr_table_setn(t, "Expires", timestr);
    ap_rwrite(buf, len, r);
    free(buf);

    https://github.com/openstreetmap/mod_tile/blob/master/src/mod_tile.c#L1212

    Запостил: ISO, 10 Января 2022

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

    • И там всё такое!
      Ответить
    • Где-то там наверняка запрятано переполнение буфера и парочка UB, а еще там shlemiel the painter раскрашивает код в цвета вялотекущей шизофазии.

      Что заставляет людей писать на си как на пхп?
      Ответить
      • > Что заставляет людей писать на си как на пхп?
        Бэкграунд.
        Ответить
        • Возможно. Культурные особенности.
          Хотя код мне напоминает не только mpak.su, но еще лабу первокурсников, когда "структурное программирование" еще в голове не обосновалось.

          Вот тут у нас прямо в одном модуле и глобальные стейты, и потоки, и сокеты, и printfы, и однобуквенные переменные, и незнание calloc, и в случайных местах некоторые маллоки проверяются, а в других нет, и наверняка где-то двойное осовбождение или висячий указатель, и даже есть sleep(5), и как-то даже обидно, что нету ``system("pause")``
          https://github.com/openstreetmap/mod_tile/blob/master/src/render_submit_queue.c
          Ответить
        • > Бэкграунд.

          Именно поэтому я за няшек на бекграунде рабочего стола.
          Ответить
    • >"\t\"description\": \"%s\",\n"

      Мдя.

      > for (i = 0; i < tile_config->noHostnames; i++)
      > 8 * 1024 - strlen(buf)
      Прям по учебнику.
      Ответить

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