The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Ошибка в BIND 9.16.17, приводящая к неверной обработке символа W в DNS-запросах, opennews (ok), 23-Июн-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


41. "Ошибка в BIND 9.16.17, приводящая к неверной обработке симво..."  +1 +/
Сообщение от Ztp (?), 23-Июн-21, 11:56 
Проглядеть то как раз легко, глаза имеют свойство замыливатся особенно на табличных данных.

А вот хоть какой-то unit-тест тут скорее всего сработал на ура

Ответить | Правка | Наверх | Cообщить модератору

47. "Ошибка в BIND 9.16.17, приводящая к неверной обработке симво..."  +2 +/
Сообщение от n00by (ok), 23-Июн-21, 13:01 
В данном случае

static const unsigned char maptolower[256] = {
    ['A'] = 'a', ['B'] = 'b', ['C'] = 'c', ['D'] = 'd', ['E'] = 'e',
    ['F'] = 'f', ['G'] = 'g', ['H'] = 'h', ['I'] = 'i', ['J'] = 'j',
    ['K'] = 'k', ['L'] = 'l', ['M'] = 'm', ['N'] = 'n', ['O'] = 'o',
    ['P'] = 'p', ['Q'] = 'q', ['R'] = 'r', ['S'] = 's', ['T'] = 't',
    ['U'] = 'u', ['V'] = 'v', ['X'] = 'x', ['Y'] = 'y', ['Z'] = 'z',
};

https://gitlab.isc.org/isc-projects/bind9/-/commit/9f13e6104...

Возможно было подсчитать количество инициализируемых элементов таблицы. Размер 5х5 мог бы смутить.

Ответить | Правка | Наверх | Cообщить модератору

68. "Ошибка в BIND 9.16.17, приводящая к неверной обработке симво..."  +/
Сообщение от n00by (ok), 23-Июн-21, 15:51 
Но интересно другое:

            if (c >= 'A' && c <= 'Z') {
                name->ndata[i] = maptolower[c]; // c + ('a' - 'A');
            }

Ответить | Правка | Наверх | Cообщить модератору

80. "Ошибка в BIND 9.16.17, приводящая к неверной обработке симво..."  +1 +/
Сообщение от Ordu (ok), 24-Июн-21, 09:30 
Угу. Я тож сначала подумал, что они от ветвления решили избавиться табличкой на 256 элементов. Но ведь нет, на 256 байт таблички они пожидились и условие всё равно нужно.

Хрен угадаешь, о чём они думали, когда писали. Может они скопипастили откуда-то код под utf8, а потом выкинули ненужное? С utf8 реально таблички нужны, т.к. все эти этнические алфавиты себя иногда странно ведут при попытке сменить регистр.

Ответить | Правка | Наверх | Cообщить модератору

81. "Ошибка в BIND 9.16.17, приводящая к неверной обработке симво..."  +1 +/
Сообщение от n00by (ok), 24-Июн-21, 11:34 
> Угу. Я тож сначала подумал, что они от ветвления решили избавиться табличкой
> на 256 элементов. Но ведь нет, на 256 байт таблички они
> пожидились и условие всё равно нужно.

Так не пожидились! Я тоже изначально не так понял, поскольку наблюдаемый вариант кажется сюром. Там две таблицы, суммой в 512 байт, из которых используются 2*26.

Вот это в Си инициализирует 0x41-й (в случае исходника в ASCII) элемент значением 'a', а остальные 255 элементов значением 0:

static const unsigned char maptolower[256] = {
    ['A'] = 'a',
};

При выборке значение символа используется как индекс массива, как в команде xlat от x86.

Таблицы могли бы иметь смысл, поскольку раньше детей пугали словами "source character set" и "EBCDIC", но тогда бы в них следовало писать не 'A', а значения из соответствующего раздела OSI/ISO.

> Хрен угадаешь, о чём они думали, когда писали. Может они скопипастили откуда-то
> код под utf8, а потом выкинули ненужное? С utf8 реально таблички
> нужны, т.к. все эти этнические алфавиты себя иногда странно ведут при
> попытке сменить регистр.

Не знаю. Признаться, я немного опасаюсь вникать в этот код. Когда-то вывел эмпирическое правило: если нашёл рядом две ошибки, обязательно где-то есть и третья.


    if (ISC_LIKELY(CASEFULLYLOWER(header))) {
        for (size_t i = 0; i < name->length; i++) {
            uint8_t c = name->ndata[i];
            if (c >= 'A' && c <= 'Z') {
                name->ndata[i] = maptolower[c];
            }
        }
    } else {
        for (size_t i = 0; i < name->length; i++) {
            uint8_t c = name->ndata[i];

            if (mask == (1 << 7)) {
                bits = header->upper[i / 8];
                mask = 1;
            } else {
                mask <<= 1;
            }

            if (c >= 'a' && c <= 'z') {
                if ((bits & mask) != 0) {
                    name->ndata[i] = maptoupper[c];
                }
            } else if (c >= 'A' && c <= 'Z') {
                if ((bits & mask) == 0) {
                    name->ndata[i] = maptolower[c];
                }
            }
        }
    }


https://gitlab.isc.org/isc-projects/bind9/-/blob/9f13e610417...
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру