diff --git a/src/acl.c b/src/acl.c
index 5d264f1d..ecaae926 100644
--- a/src/acl.c
+++ b/src/acl.c
@@ -259,6 +259,38 @@ void ACLResetSubcommands(user *u) {
     u->allowed_subcommands = NULL;
 }
 
+
+/* Add a subcommand to the list of subcommands for the user 'u' and
+ * the command id specified. */
+void ACLAddAllowedSubcommand(user *u, unsigned long id, const char *sub) {
+    /* If this is the first subcommand to be configured for
+     * this user, we have to allocate the subcommands array. */
+    if (u->allowed_subcommands == NULL) {
+        u->allowed_subcommands = zcalloc(USER_COMMAND_BITS_COUNT *
+                                 sizeof(sds*));
+    }
+
+    /* We also need to enlarge the allocation pointing to the
+     * null terminated SDS array, to make space for this one.
+     * To start check the current size, and while we are here
+     * make sure the subcommand is not already specified inside. */
+    long items = 0;
+    if (u->allowed_subcommands[id]) {
+        while(u->allowed_subcommands[id][items]) {
+            /* If it's already here do not add it again. */
+            if (!strcasecmp(u->allowed_subcommands[id][items],sub)) return;
+            items++;
+        }
+    }
+
+    /* Now we can make space for the new item (and the null term). */
+    items += 2;
+    u->allowed_subcommands[id] = zrealloc(u->allowed_subcommands[id],
+                                 sizeof(sds)*items);
+    u->allowed_subcommands[id][items-2] = sdsnew(sub);
+    u->allowed_subcommands[id][items-1] = NULL;
+}
+
 /* Set user properties according to the string "op". The following
  * is a description of what different strings will do:
  *
@@ -403,25 +435,8 @@ int ACLSetUser(user *u, const char *op, ssize_t oplen) {
                 return C_ERR;
             }
 
-            /* If this is the first subcommand to be configured for
-             * this user, we have to allocate the subcommands array. */
-            if (u->allowed_subcommands == NULL) {
-                u->allowed_subcommands = zcalloc(USER_COMMAND_BITS_COUNT *
-                                         sizeof(sds*));
-            }
-
-            /* We also need to enlarge the allocation pointing to the
-             * null terminated SDS array, to make space for this one. */
-            long items = 0;
-            if (u->allowed_subcommands[id]) {
-                while(u->allowed_subcommands[items]) items++;
-            }
-
-            items += 2; /* Make space for the new item and the null term. */
-            u->allowed_subcommands[id] = zrealloc(u->allowed_subcommands[id],
-                                         sizeof(sds)*items);
-            u->allowed_subcommands[id][items-2] = sdsnew(sub);
-            u->allowed_subcommands[id][items-1] = NULL;
+            /* Add the subcommand to the list of valid ones. */
+            ACLAddAllowedSubcommand(u,id,sub);
 
             /* We have to clear the command bit so that we force the
              * subcommand check. */