summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/acl.c14
-rw-r--r--src/config.c3
-rw-r--r--src/server.h2
3 files changed, 14 insertions, 5 deletions
diff --git a/src/acl.c b/src/acl.c
index 43517300b..991be210e 100644
--- a/src/acl.c
+++ b/src/acl.c
@@ -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;
}
}
diff --git a/src/config.c b/src/config.c
index b2600d2ea..c852b01b7 100644
--- a/src/config.c
+++ b/src/config.c
@@ -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;
}
diff --git a/src/server.h b/src/server.h
index 3f23cee20..cbf995d4e 100644
--- a/src/server.h
+++ b/src/server.h
@@ -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 */