return ok;
}
-static bool parse_literal(struct ace_condition_sddl_compiler_context *comp)
+static bool parse_literal(struct ace_condition_sddl_compiler_context *comp,
+ bool in_composite)
{
uint8_t c = comp->sddl[comp->offset];
if (!(comp->state & SDDL_FLAG_EXPECTING_LITERAL)) {
case 'S':
return parse_sid(comp);
case '{':
- return parse_composite(comp);
+ if (in_composite) {
+ /* nested composites are not supported */
+ return false;
+ } else {
+ return parse_composite(comp);
+ }
default:
if (strchr("1234567890-+", c) != NULL) {
return parse_int(comp);
*comp->target_len);
goto fail;
}
- ok = parse_literal(comp);
+ ok = parse_literal(comp, true);
if (!ok) {
goto fail;
}
return false;
}
comp->offset++;
- ok = parse_literal(comp);
+ ok = parse_literal(comp, false);
if (!ok) {
return false;
}
} else if (is_attr_char1(c)) {
ok = parse_word(comp);
} else if (comp->state & SDDL_FLAG_EXPECTING_LITERAL) {
- ok = parse_literal(comp);
+ ok = parse_literal(comp, false);
} else {
if (c > 31 && c < 127) {
comp_error(comp,
*comp->target_len);
goto fail;
}
- ok = parse_literal(comp);
+ ok = parse_literal(comp, true);
if (!ok) {
goto fail;
}
}
comp.offset += 5;
comp.state = SDDL_FLAG_EXPECTING_LITERAL;
- ok = parse_literal(&comp);
+ ok = parse_literal(&comp, false);
if (!ok ||
comp.program->length != 1) {
DBG_WARNING("invalid attr flags: %s\n", str);
}
comp.state = SDDL_FLAG_EXPECTING_LITERAL;
- ok = parse_literal(&comp);
+ ok = parse_literal(&comp, false);
if (!ok) {
goto error;