Другая возможность состоит в том, что его функция используется только в приложении (или его части), которое сделало что-то, чтобы гарантировать, что вызов не будет прерван сигналом. Если вы не собираетесь делать что-то важное с сигналами, то вам не нужно реагировать на них, и, возможно, имеет смысл замаскировать их все, а не оборачивать каждый отдельный системный вызов блокировки при повторной попытке EINTR. За исключением, конечно, тех, которые вас убьют, так что SIGKILL и часто SIGPIPE, если вы справитесь с этим, выйдя вместе с SIGSEGV и подобными фатальными ошибками, которые в любом случае никогда не будут доставлены в правильное приложение пользовательского пространства.
В любом случае, если он говорит только о безопасности, то вполне возможно, что ему не придется повторять close
. Если закрыть EIO не удастся, то он не сможет повторить попытку, это будет постоянный сбой. Следовательно, для правильности его программы необязательно, чтобы close
был успешным. Вполне возможно, что для правильности его программы необязательно повторять close
в EINTR.
Обычно вы хотите, чтобы ваша программа делала все возможное, чтобы добиться успеха, а это означает повторную попытку EINTR. Но это отдельная проблема от безопасности. Если ваша программа разработана таким образом, что сбой какой-либо функции по какой-либо причине не является недостатком безопасности, то, в частности, тот факт, что случается с ошибкой EINTR, а не по постоянной причине, не является изъян. DJB, как известно, был довольно самоуверенным, поэтому я не удивлюсь, если он докажет какую-то причину, по которой ему не нужно , чтобы повторить попытку, и поэтому он не беспокоится, даже если это будет позволить своей программе успешно очистить дескриптор в определенных ситуациях, когда, возможно, в данный момент происходит сбой (например, если в критический момент пользователь явно отправил безвредный сигнал с kill
).
Редактировать: мне приходит в голову, что повторная попытка EINTR потенциально может быть ошибкой безопасности при определенных условиях. Он вводит новое поведение в этот раздел кода: он может бесконечно зацикливаться в ответ на поток сигнала, когда ранее он делал одну попытку close
и затем возвращался. Я точно не знаю, что это вызовет проблемы с qmail (в конце концов, close
сам не дает никаких гарантий относительно того, как скоро он вернется). Но если сдача после одной попытки действительно облегчает анализ кода, то это может быть разумным шагом. Или нет.
Вы можете подумать, что повторная попытка предотвращает ошибку DoS, когда сигнал вызывает ложный сбой. Но повторная попытка допускает еще один (более сложный) недостаток DoS, когда поток сигнала вызывает неопределенный останов. С точки зрения бинарного «может ли это приложение быть DoSed?», Что является абсолютным вопросом безопасности, который интересовал DJB, когда он писал qmail и djbdns, это не имеет значения. Если что-то может случиться один раз, то обычно это означает, что это может случиться много раз.