ACL: make ACLAppendUserForLoading() able to report bad argument.

This commit is contained in:
antirez 2019-02-04 13:00:38 +01:00
parent 21e84cdae2
commit b166c41edd
3 changed files with 14 additions and 5 deletions

View File

@ -931,9 +931,16 @@ int ACLCheckCommandPerm(client *c) {
*
* Note that this function cannot stop in case of commands that are not found
* and, in that case, the error will be emitted later, because certain
* commands may be defined later once modules are loaded. */
int ACLAppendUserForLoading(sds *argv, int argc) {
if (argc < 2 || strcasecmp(argv[0],"user")) return C_ERR;
* commands may be defined later once modules are loaded.
*
* When an error is detected and C_ERR is returned, the function populates
* by reference (if not set to NULL) the argc_err argument with the index
* of the argv vector that caused the error. */
int ACLAppendUserForLoading(sds *argv, int argc, int *argc_err) {
if (argc < 2 || strcasecmp(argv[0],"user")) {
if (argc_err) *argc_err = 0;
return C_ERR;
}
/* Try to apply the user rules in a fake user to see if they
* are actually valid. */
@ -947,6 +954,7 @@ int ACLAppendUserForLoading(sds *argv, int argc) {
if (ACLSetUser(fakeuser,argv[j],sdslen(argv[j])) == C_ERR) {
if (errno != ENOENT) {
ACLFreeUser(fakeuser);
if (argc_err) *argc_err = j;
return C_ERR;
}
}

View File

@ -792,7 +792,8 @@ void loadServerConfigFromString(char *config) {
goto loaderr;
}
} else if (!strcasecmp(argv[0],"user") && argc >= 2) {
if (ACLAppendUserForLoading(argv,argc) == C_ERR) {
int argc_err;
if (ACLAppendUserForLoading(argv,argc,&argc_err) == C_ERR) {
err = "Syntax error in user declaration";
goto loaderr;
}

View File

@ -1738,7 +1738,7 @@ int ACLCheckCommandPerm(client *c);
int ACLSetUser(user *u, const char *op, ssize_t oplen);
sds ACLDefaultUserFirstPassword(void);
uint64_t ACLGetCommandCategoryFlagByName(const char *name);
int ACLAppendUserForLoading(sds *argv, int argc);
int ACLAppendUserForLoading(sds *argv, int argc, int *argc_err);
/* Sorted sets data type */