1. C++ / Говнокод #11576

    +8

    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
    bool ASN1Parser::ConvertOID(const ASN1Block &blk, char *oid, unsigned int bufSize) {
        int a = 0;
        bool first = true;
        char tmp[32];
        oid[0] = 0;
        for (unsigned int i=0;i<blk.size;i++) {
            unsigned char c = data[blk.offset+i];
            if (c & 0x80) {
                a = (a << 7) | (c & 0x7F);
            } else {
                a = (a << 7) | (c & 0x7F);
                if (!first) {
                    sprintf(tmp,".%d",a);
                } else {
                    sprintf(tmp,"%d.%d",a/40,a%40);
                }
                a=0;
                first = false;
                if (strlen(tmp) >= bufSize) return false;
                strcat(oid, tmp);
            }
        }
        return true;
    }

    И еще один говнокодец на тему ASN.1 - распаковка OID'а.
    Кто найдет ошибку - получит пирожок с полочки ;)

    Запостил: bormand, 12 Августа 2012

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

    • 'a' должен быть точно int, а не unsigned?
      ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается

      давненько я уже работал с сертификатами - единожды написанное (врапперы над ms cryptoapi и openssl) неплохо работает (по крайней мере, первый:) ) до сих пор
      Ответить
      • > 'a' должен быть точно int, а не unsigned?
        Да, но это просто говнецо, а не ошибка, насколько помню числа в OID'ах все равно не превысят 65535.

        > ну и смущает магия с if (c & 0x80) - меняется a, но ничего дальше не делается
        В нем накапливается результат. Если число не влазит в один байт - оно разбивается на несколько, причем у всех кроме последнего выставляется старший бит. Тут все норм, хотя надо бы вынести эту формулу за if.

        > врапперы над ms cryptoapi и openssl
        Правильный подход, полностью поддерживаю ;)

        А ошибка тут гораздо банальней, чтобы ее найти не нужно даже знать что такое OID...
        Ответить
        • возможное переполнение буфера в 20 строке?
          Ответить
          • Так точно.
            Ответить
            • это в наказание за использование опасной, как лезвие бритвы, C standard library в мерзком крестоблядском коде
              Ответить
              • Мерзкий крестоблядский фикс:
                std::stringstream buf;
                // ...
                if (!first) {
                    buf << "." << a;
                } else {
                    buf << (a/40) << "." << (a % 40);
                }
                // ...
                return buf.str();
                Ответить

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