mirror of
https://github.com/sudo-project/sudo.git
synced 2025-09-02 23:35:36 +00:00
When parsing sudoOptions that include an operator (!, +, +=, -=)
strip out any whitespace on either side of the operator.
This commit is contained in:
@@ -1046,7 +1046,7 @@ static bool
|
|||||||
sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
|
sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
|
||||||
{
|
{
|
||||||
struct berval **bv, **p;
|
struct berval **bv, **p;
|
||||||
char *var, *val;
|
char *cp, *var;
|
||||||
int op;
|
int op;
|
||||||
bool rc = false;
|
bool rc = false;
|
||||||
debug_decl(sudo_ldap_parse_options, SUDOERS_DEBUG_LDAP)
|
debug_decl(sudo_ldap_parse_options, SUDOERS_DEBUG_LDAP)
|
||||||
@@ -1064,17 +1064,25 @@ sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
|
|||||||
DPRINTF2("ldap sudoOption: '%s'", var);
|
DPRINTF2("ldap sudoOption: '%s'", var);
|
||||||
|
|
||||||
/* check for equals sign past first char */
|
/* check for equals sign past first char */
|
||||||
val = strchr(var, '=');
|
cp = strchr(var, '=');
|
||||||
if (val > var) {
|
if (cp > var) {
|
||||||
*val++ = '\0'; /* split on = and truncate var */
|
char *val = cp + 1;
|
||||||
op = val[-2]; /* peek for += or -= cases */
|
op = cp[-1]; /* peek for += or -= cases */
|
||||||
if (op == '+' || op == '-') {
|
if (op == '+' || op == '-') {
|
||||||
/* case var+=val or var-=val */
|
/* case var+=val or var-=val */
|
||||||
val[-2] = '\0'; /* remove extra + or - char */
|
cp--;
|
||||||
} else {
|
} else {
|
||||||
/* case var=val */
|
/* case var=val */
|
||||||
op = true;
|
op = true;
|
||||||
}
|
}
|
||||||
|
/* Trim whitespace between var and operator. */
|
||||||
|
while (cp > var && isblank((unsigned char)cp[-1]))
|
||||||
|
cp--;
|
||||||
|
/* Truncate variable name. */
|
||||||
|
*cp = '\0';
|
||||||
|
/* Trim leading whitespace from val. */
|
||||||
|
while (isblank((unsigned char)*val))
|
||||||
|
val++;
|
||||||
/* Strip double quotes if present. */
|
/* Strip double quotes if present. */
|
||||||
if (*val == '"') {
|
if (*val == '"') {
|
||||||
char *ep = val + strlen(val);
|
char *ep = val + strlen(val);
|
||||||
@@ -1086,7 +1094,10 @@ sudo_ldap_parse_options(LDAP *ld, LDAPMessage *entry)
|
|||||||
set_default(var, val, op);
|
set_default(var, val, op);
|
||||||
} else if (*var == '!') {
|
} else if (*var == '!') {
|
||||||
/* case !var Boolean False */
|
/* case !var Boolean False */
|
||||||
set_default(var + 1, NULL, false);
|
do {
|
||||||
|
var++;
|
||||||
|
} while (isblank((unsigned char)*var));
|
||||||
|
set_default(var, NULL, false);
|
||||||
} else {
|
} else {
|
||||||
/* case var Boolean True */
|
/* case var Boolean True */
|
||||||
set_default(var, NULL, true);
|
set_default(var, NULL, true);
|
||||||
|
@@ -1024,7 +1024,7 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
|
|||||||
{
|
{
|
||||||
int i, op;
|
int i, op;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
char *v, *val;
|
char *cp, *v;
|
||||||
char **val_array = NULL;
|
char **val_array = NULL;
|
||||||
debug_decl(sudo_sss_parse_options, SUDOERS_DEBUG_SSSD);
|
debug_decl(sudo_sss_parse_options, SUDOERS_DEBUG_SSSD);
|
||||||
|
|
||||||
@@ -1052,17 +1052,25 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check for equals sign past first char */
|
/* check for equals sign past first char */
|
||||||
val = strchr(v, '=');
|
cp = strchr(v, '=');
|
||||||
if (val > v) {
|
if (cp > v) {
|
||||||
*val++ = '\0'; /* split on = and truncate var */
|
char *val = cp + 1;
|
||||||
op = val[-2]; /* peek for += or -= cases */
|
op = cp[-1]; /* peek for += or -= cases */
|
||||||
if (op == '+' || op == '-') {
|
if (op == '+' || op == '-') {
|
||||||
/* case var+=val or var-=val */
|
/* case var+=val or var-=val */
|
||||||
val[-2] = '\0'; /* remove extra + or - char */
|
cp--;
|
||||||
} else {
|
} else {
|
||||||
/* case var=val */
|
/* case var=val */
|
||||||
op = true;
|
op = true;
|
||||||
}
|
}
|
||||||
|
/* Trim whitespace between var and operator. */
|
||||||
|
while (cp > v && isblank((unsigned char)cp[-1]))
|
||||||
|
cp--;
|
||||||
|
/* Truncate variable name. */
|
||||||
|
*cp = '\0';
|
||||||
|
/* Trim leading whitespace from val. */
|
||||||
|
while (isblank((unsigned char)*val))
|
||||||
|
val++;
|
||||||
/* Strip double quotes if present. */
|
/* Strip double quotes if present. */
|
||||||
if (*val == '"') {
|
if (*val == '"') {
|
||||||
char *ep = val + strlen(val);
|
char *ep = val + strlen(val);
|
||||||
@@ -1074,7 +1082,10 @@ sudo_sss_parse_options(struct sudo_sss_handle *handle, struct sss_sudo_rule *rul
|
|||||||
set_default(v, val, op);
|
set_default(v, val, op);
|
||||||
} else if (*v == '!') {
|
} else if (*v == '!') {
|
||||||
/* case !var Boolean False */
|
/* case !var Boolean False */
|
||||||
set_default(v + 1, NULL, false);
|
do {
|
||||||
|
v++;
|
||||||
|
} while (isblank((unsigned char)*v));
|
||||||
|
set_default(v, NULL, false);
|
||||||
} else {
|
} else {
|
||||||
/* case var Boolean True */
|
/* case var Boolean True */
|
||||||
set_default(v, NULL, true);
|
set_default(v, NULL, true);
|
||||||
|
Reference in New Issue
Block a user