A macro __ATTR
se expande para o seguinte [1]:
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), \
.mode = VERIFY_OCTAL_PERMISSIONS(_mode) }, \
.show = _show, \
.store = _store, \
}
Observe o uso da macro VERIFY_OCTAL_PERMISSIONS
. Essa macro se expande para o seguinte [2]:
#define VERIFY_OCTAL_PERMISSIONS(perms) \
(BUILD_BUG_ON_ZERO((perms) < 0) + \
BUILD_BUG_ON_ZERO((perms) > 0777) + \
/* USER_READABLE >= GROUP_READABLE >= OTHER_READABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 4) < (((perms) >> 3) & 4)) + \
BUILD_BUG_ON_ZERO((((perms) >> 3) & 4) < ((perms) & 4)) + \
/* USER_WRITABLE >= GROUP_WRITABLE */ \
BUILD_BUG_ON_ZERO((((perms) >> 6) & 2) < (((perms) >> 3) & 2)) + \
/* OTHER_WRITABLE? Generally considered a bad idea. */ \
BUILD_BUG_ON_ZERO((perms) & 2) + \
(perms))
Qual versão de BUILD_BUG_ON_ZERO
você obtém depende de uma macro que eu não localizei, mas você deve observar o comentário na macro acima: "OTHER_WRITABLE? Geralmente considerada uma má ideia".
Embora eu não tenha rastreado o caminho da chamada, meu palpite é que o código filtra / ignora o+w
.
Tudo o que foi dito, por que você deseja que um usuário não privilegiado possa interagir diretamente com um hardware?
[1] link
[2] link