fix clear USER_FLAG_ALLCOMMANDS flag in acl

in ACLSetUserCommandBit, when the command bit overflows, no operation
is performed, so no need clear the USER_FLAG_ALLCOMMANDS flag.

in ACLSetUser, when adding subcommand, we don't need to call
ACLGetCommandID ahead since subcommand may be empty.
This commit is contained in:
hujie 2020-05-19 00:58:58 +08:00
parent bf3a67be43
commit edc1f7b176

View File

@ -375,12 +375,13 @@ int ACLUserCanExecuteFutureCommands(user *u) {
* to skip the command bit explicit test. */ * to skip the command bit explicit test. */
void ACLSetUserCommandBit(user *u, unsigned long id, int value) { void ACLSetUserCommandBit(user *u, unsigned long id, int value) {
uint64_t word, bit; uint64_t word, bit;
if (value == 0) u->flags &= ~USER_FLAG_ALLCOMMANDS;
if (ACLGetCommandBitCoordinates(id,&word,&bit) == C_ERR) return; if (ACLGetCommandBitCoordinates(id,&word,&bit) == C_ERR) return;
if (value) if (value) {
u->allowed_commands[word] |= bit; u->allowed_commands[word] |= bit;
else } else {
u->allowed_commands[word] &= ~bit; u->allowed_commands[word] &= ~bit;
u->flags &= ~USER_FLAG_ALLCOMMANDS;
}
} }
/* This is like ACLSetUserCommandBit(), but instead of setting the specified /* This is like ACLSetUserCommandBit(), but instead of setting the specified
@ -845,7 +846,6 @@ int ACLSetUser(user *u, const char *op, ssize_t oplen) {
errno = ENOENT; errno = ENOENT;
return C_ERR; return C_ERR;
} }
unsigned long id = ACLGetCommandID(copy);
/* The subcommand cannot be empty, so things like DEBUG| /* The subcommand cannot be empty, so things like DEBUG|
* are syntax errors of course. */ * are syntax errors of course. */
@ -858,6 +858,7 @@ int ACLSetUser(user *u, const char *op, ssize_t oplen) {
/* The command should not be set right now in the command /* The command should not be set right now in the command
* bitmap, because adding a subcommand of a fully added * bitmap, because adding a subcommand of a fully added
* command is probably an error on the user side. */ * command is probably an error on the user side. */
unsigned long id = ACLGetCommandID(copy);
if (ACLGetUserCommandBit(u,id) == 1) { if (ACLGetUserCommandBit(u,id) == 1) {
zfree(copy); zfree(copy);
errno = EBUSY; errno = EBUSY;