С помощью приведенного выше кода вы можете оказаться в одном из следующих случаев:
- Пользователь имеет разрешение на выполнение для "somefile"
- Пользователь имеет разрешение на чтение для "somefile"
- Пользователь имеет и разрешение на чтение и выполнение для "somefile"
Причина в том, что существует состояние гонки из-за неатомичности базового Cреализация chmod.Изучение исходного кода для утилиты chmod :
if (ok)
{
old_mode = file_stats->st_mode;
new_mode = mode_adjust (old_mode, S_ISDIR (old_mode) != 0, umask_value,
change, NULL);
if (! S_ISLNK (old_mode))
{
if (chmodat (fts->fts_cwd_fd, file, new_mode) == 0)
chmod_succeeded = true;
else
{
if (! force_silent)
error (0, errno, _("changing permissions of %s"),
quoteaf (file_full_name));
ok = false;
}
}
}
Функция mode_adjust
реализована в modechange.c gnulib.Он включает или выключает биты в старом режиме в соответствии с запрошенным изменением и возвращает значение нового режима.Когда две операции chmod выполняются параллельно, может случиться так, что обе они получат исходный режим исходного файла;тогда они оба вычисляют требуемый new_mode.С другой стороны, возможно также, что два chmod выполняются последовательно, и, таким образом, последний режим файла представляет собой «сумму» двух операций.