Кто отвечает за установку нулевого терминатора при обработке TB_GETBUTTONTEXT? - PullRequest
1 голос
/ 10 августа 2010

Документация для TB_GETBUTTONTEXT гласит, что обработчик должен вернуть количество символов и, необязательно (если lParam не ноль), скопировать строку в предоставленный буфер.

Предостережение заключается в том, что длина не включает завершающий символ.Я вижу следующую проблему.Скажем, обработчик сохраняет предварительно вычисленную строку (поэтому ее длина не меняется).Сначала вызывающий абонент отправляет сообщение с lParam, установленным в нуль - чтобы найти количество символов - и обработчик возвращает количество символов без завершающего ноль.Затем вызывающая сторона выделяет память и снова отправляет сообщение - на этот раз адрес буфера передается как lParam.

Должен ли обработчик копировать завершающий нуль?Я имею в виду, что если в первый раз обработчик возвратил N, и вызывающий объект выделил пространство для N символов, а обработчик добавляет завершающий ноль, то происходит переполнение буфера.Но если вызывающая сторона действительно ожидала, что строка будет завершена нулем, и выделено пространство для N+1 символов, а обработчик не добавляет нулевой терминатор, обработчик будет иметь строку, которая не заканчивается нулем, и снова может произойти переполнение буфера (есливызывающий не достаточно осторожен).

Так что же делать обработчику?Должен ли он копировать нулевой терминатор или нет?

1 Ответ

2 голосов
/ 10 августа 2010

MFC использует разумный подход в своей реализации CMFCToolBar :: OnGetButtonText (), он предполагает, что вызывающий объект знает, что ему следует выделить N + 1, и использует lstrcpy () для копирования текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...