Баг в atlmime.h
От: Кодёнок  
Дата: 05.09.05 10:44
Оценка:
CMimeRawAttachment::Initialize()

        if (szDisplayName)
        {
            // use the user-specified display name
            _tcscpy(m_szDisplayName, szDisplayName);
            _tcsncpy(m_szDisplayName, szDisplayName, sizeof(szDisplayName)/sizeof(TCHAR));
            m_szDisplayName[sizeof(szDisplayName)/sizeof(TCHAR)-1] = 0;
        }


Из-за двух последних инструкций длина имени обрезается, до 3-х символов. Причём m_szDisplayName -- TCHAR[_MAX_FNAME].

05.09.05 20:43: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Re: Баг в atlmime.h
От: Кодёнок  
Дата: 05.09.05 11:05
Оценка:
Еще один баг, в том же файле, CMimeAttachment::MakeMimeHeader:

        // if no display name is specified, default to "rawdata"
        return MakeMimeHeader(header, szBoundary, _T("rawdata"));


а должно быть что-то вроде

        return MakeMimeHeader(header, szBoundary, m_szDisplayName[0] ? m_szDisplayName : _T("rawdata"));


Я не понял, я что, единственный, кто это использует? Это я только тестовый пример написал, а мне надо слать HTML-сообщение с правильно вставленными картиками. Сколько там еще багов скрыто... может не стоит этим пользоваться? И если там утечка памяти — для моего приложения это убийственно (постоянно работающий сервис).

И это включенно в комплект VC++ и даже помечено как 7-я версия! Я понимаю, какой-нибудь трудноуловимый баг, но эти говорят о том, что эти классы похоже вообще нормально не тестировали.
Re[2]: Баг в atlmime.h
От: Vodka  
Дата: 05.09.05 11:23
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>Я не понял, я что, единственный, кто это использует?

Нет, не единственный . Я это использовал для отправки по SMTP. Так как искать альтернативы не было времени, всё решилось наследованием, copy/paste и исправлениями в нужных местах. Корявое решение получилось, но для того момента оно вполне подходило.

Кё>И это включенно в комплект VC++ и даже помечено как 7-я версия! Я понимаю, какой-нибудь трудноуловимый баг, но эти говорят о том, что эти классы похоже вообще нормально не тестировали.

Бывает
Re: Баг в atlmime.h
От: novik Россия  
Дата: 06.09.05 07:44
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>CMimeRawAttachment::Initialize()


Кё>
Кё>        if (szDisplayName)
Кё>        {
Кё>            // use the user-specified display name
Кё>            _tcscpy(m_szDisplayName, szDisplayName);
Кё>            _tcsncpy(m_szDisplayName, szDisplayName, sizeof(szDisplayName)/sizeof(TCHAR));
Кё>            m_szDisplayName[sizeof(szDisplayName)/sizeof(TCHAR)-1] = 0;
Кё>        }
Кё>


Кё>Из-за двух последних инструкций длина имени обрезается, до 3-х символов. Причём m_szDisplayName -- TCHAR[_MAX_FNAME].


sizeof(szDisplayName)/sizeof(TCHAR) у вас равняется четырем! Потому что sizeof любого указателя в Win32 равен четырем, а szDisplayName у вас скорее всего не массив, а указатель, хоть из приведенного текста этого и не видно.
Re[2]: Баг в atlmime.h
От: Кодёнок  
Дата: 06.09.05 08:06
Оценка:
Здравствуйте, novik, Вы писали:

N>sizeof(szDisplayName)/sizeof(TCHAR) у вас равняется четырем!


Это не у меня, это у M$. Потому что они перепутали szDisplayName : char* и m_szDisplayName : char[N]

И вообще код в таком сишном стиле, несмотря на то, что в ATL есть CString.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.