2014-12-31 4 views
1

Является ли этот код безопасен:strerror_r буфер всегда нулем

strerror_r(errcode,buffer,length); 
printf("Error: %s",buffer); 

То есть, я могу доверять буферные быть нулем в случае, если буфер слишком мал? На странице руководства:

Соответствующий XSI strerror_r() является предпочтительным для переносных приложений. Он возвращает строку ошибки в пользовательском буфере buf длины buflen.

GNU-специфический strerror_r() возвращает указатель на строку, содержащую сообщение об ошибке. Это может быть либо указатель на строку, которую функция хранит в buf, либо указатель на некоторую (неизменяемую) статическую строку (в этом случае buf не используется). Если функция хранит строку в buf, то сохраняются не более байтовые байты (строка может быть усечена, если buflen слишком мал и errnum неизвестен). Строка всегда включает в себя завершающий нулевой байт ('\ 0').

Правильно ли я, что если я использую XSI-совместимую версию, может случиться так, что буфер не нуль.

+0

@yellowantphil RHEL 5.4 не имеет отношения к делу, если ядро ​​не было обновлено до версии 2.6.36 и gcc до 4.8. – user877329

ответ

1

Если вы используете POSIX strerror_r, и он возвращает ненулевое значение, я не уверен, что вы можете предположить, что что-либо вообще находится в buffer. Вы можете проверить man 3p strerror для описания функции POSIX, но он не говорит, что происходит с buffer, если length не достаточно большой.

Возможно, какая-либо другая часть стандарта POSIX говорит, что происходит в подобных ситуациях, но я подозреваю, что она не указана. Я бы проверил возвращаемое значение strerror_r и не использовал buffer, если он не равен нулю, просто чтобы быть в безопасности.

В двух системах, где я это пробовал, компилятор скопировал сообщение об ошибке в буфер и усекал его с помощью NUL-байта. На RHEL 5.4, strerror_r не изменял buffer, если его размер был слишком мал. В этом случае buffer может быть любым, если вы не инициализировали его до катания sterror_r.

0

Here is the changelog for xpg-strerror.c:

2011-05-21 Ulrich Drepper Always fill output buffer in XPG strerror function blob | commitdiff | diff to current 
2010-12-25 Ulrich Drepper Change XPG-compliant strerror_r function to return... blob | commitdiff | diff to current 

Так что, если я предполагаю, что приличную версию glibc, кажется, что все будет в порядке. Если какой-то парень не вернется к изменению.

Смежные вопросы