]> granicus.if.org Git - sudo/commitdiff
Add support for parsing quoted strings in a sudoOption just like
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 7 Jul 2015 16:58:05 +0000 (10:58 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 7 Jul 2015 16:58:05 +0000 (10:58 -0600)
sudoers Defaults settings.

plugins/sudoers/ldap.c
plugins/sudoers/sssd.c

index 887092a3bd009d3544ee2faed2edb332b349b324..9addea4f733ac12246a88890a5a2a73461af5d52 100644 (file)
@@ -1046,7 +1046,8 @@ static bool
 sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
 {
     struct berval **bv, **p;
-    char op, *var, *val;
+    char *var, *val;
+    int op;
     bool rc = false;
     debug_decl(sudo_ldap_parse_options, SUDOERS_DEBUG_LDAP)
 
@@ -1066,15 +1067,23 @@ sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
        val = strchr(var, '=');
        if (val > var) {
            *val++ = '\0';      /* split on = and truncate var */
-           op = *(val - 2);    /* peek for += or -= cases */
+           op = val[-2];       /* peek for += or -= cases */
            if (op == '+' || op == '-') {
-               *(val - 2) = '\0';      /* found, remove extra char */
                /* case var+=val or var-=val */
-               set_default(var, val, (int) op);
+               val[-2] = '\0'; /* remove extra + or - char */
            } else {
                /* case var=val */
-               set_default(var, val, true);
+               op = true;
            }
+           /* Strip double quotes if present. */
+           if (*val == '"') {
+               char *ep = val + strlen(val);
+               if (ep != val && ep[-1] == '"') {
+                   val++;
+                   ep[-1] = '\0';
+               }
+           }
+           set_default(var, val, op);
        } else if (*var == '!') {
            /* case !var Boolean False */
            set_default(var + 1, NULL, false);
index 10234ed6b590364c16ba6484797751c308bfb75a..7e6f4fc508c78429dc3d436cf4150b5b33933f95 100644 (file)
@@ -1021,9 +1021,9 @@ sudo_sss_check_command(struct sudo_sss_handle *handle,
 static bool
 sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule)
 {
-    int i;
+    int i, op;
     bool ret = false;
-    char op, *v, *val;
+    char *v, *val;
     char **val_array = NULL;
     debug_decl(sudo_sss_parse_options, SUDOERS_DEBUG_SSSD);
 
@@ -1054,15 +1054,23 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
        val = strchr(v, '=');
        if (val > v) {
            *val++ = '\0';      /* split on = and truncate var */
-           op = *(val - 2);    /* peek for += or -= cases */
+           op = val[-2];       /* peek for += or -= cases */
            if (op == '+' || op == '-') {
-               *(val - 2) = '\0';      /* found, remove extra char */
                /* case var+=val or var-=val */
-               set_default(v, val, (int) op);
+               val[-2] = '\0'; /* remove extra + or - char */
            } else {
                /* case var=val */
-               set_default(v, val, true);
+               op = true;
+           }
+           /* Strip double quotes if present. */
+           if (*val == '"') {
+               char *ep = val + strlen(val);
+               if (ep != val && ep[-1] == '"') {
+                   val++;
+                   ep[-1] = '\0';
+               }
            }
+           set_default(v, val, op);
        } else if (*v == '!') {
            /* case !var Boolean False */
            set_default(v + 1, NULL, false);