mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-09-02 23:35:37 +00:00
make the parse_sub_mode code more generic
Make it more generic so that it can be shared with signals. Signed-off-by: John Johansen <john.johansen@canonical.com> Acked-by: Steve Beattie <steve@nxnw.org>
This commit is contained in:
@@ -32,79 +32,10 @@
|
|||||||
|
|
||||||
#define _(s) gettext(s)
|
#define _(s) gettext(s)
|
||||||
|
|
||||||
static int parse_dbus_sub_mode(const char *str_mode, int *result, int fail, const char *mode_desc __unused)
|
|
||||||
{
|
|
||||||
int mode = 0;
|
|
||||||
const char *p;
|
|
||||||
|
|
||||||
PDEBUG("Parsing DBus mode: %s\n", str_mode);
|
|
||||||
|
|
||||||
if (!str_mode)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
p = str_mode;
|
|
||||||
while (*p) {
|
|
||||||
char current = *p;
|
|
||||||
char lower;
|
|
||||||
|
|
||||||
reeval:
|
|
||||||
switch (current) {
|
|
||||||
case COD_READ_CHAR:
|
|
||||||
PDEBUG("Parsing DBus mode: found %s READ\n", mode_desc);
|
|
||||||
mode |= AA_DBUS_RECEIVE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case COD_WRITE_CHAR:
|
|
||||||
PDEBUG("Parsing DBus mode: found %s WRITE\n",
|
|
||||||
mode_desc);
|
|
||||||
mode |= AA_DBUS_SEND;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* error cases */
|
|
||||||
|
|
||||||
default:
|
|
||||||
lower = tolower(current);
|
|
||||||
switch (lower) {
|
|
||||||
case COD_READ_CHAR:
|
|
||||||
case COD_WRITE_CHAR:
|
|
||||||
PDEBUG("Parsing DBus mode: found invalid upper case char %c\n",
|
|
||||||
current);
|
|
||||||
warn_uppercase();
|
|
||||||
current = lower;
|
|
||||||
goto reeval;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (fail)
|
|
||||||
yyerror(_("Internal: unexpected DBus mode character '%c' in input"),
|
|
||||||
current);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
PDEBUG("Parsed DBus mode: %s 0x%x\n", str_mode, mode);
|
|
||||||
|
|
||||||
*result = mode;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_dbus_mode(const char *str_mode, int *mode, int fail)
|
int parse_dbus_mode(const char *str_mode, int *mode, int fail)
|
||||||
{
|
{
|
||||||
*mode = 0;
|
return parse_X_mode("DBus", AA_VALID_DBUS_PERMS, str_mode, mode, fail);
|
||||||
if (!parse_dbus_sub_mode(str_mode, mode, fail, ""))
|
|
||||||
return 0;
|
|
||||||
if (*mode & ~AA_VALID_DBUS_PERMS) {
|
|
||||||
if (fail)
|
|
||||||
yyerror(_("Internal error generated invalid DBus perm 0x%x\n"),
|
|
||||||
mode);
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void move_conditional_value(char **dst_ptr, struct cond_entry *cond_ent)
|
static void move_conditional_value(char **dst_ptr, struct cond_entry *cond_ent)
|
||||||
|
@@ -331,6 +331,7 @@ extern int name_to_capability(const char *keyword);
|
|||||||
extern int get_rlimit(const char *name);
|
extern int get_rlimit(const char *name);
|
||||||
extern char *process_var(const char *var);
|
extern char *process_var(const char *var);
|
||||||
extern int parse_mode(const char *mode);
|
extern int parse_mode(const char *mode);
|
||||||
|
extern int parse_X_mode(const char *X, int valid, const char *str_mode, int *mode, int fail);
|
||||||
extern struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id);
|
extern struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id);
|
||||||
extern struct aa_network_entry *new_network_ent(unsigned int family,
|
extern struct aa_network_entry *new_network_ent(unsigned int family,
|
||||||
unsigned int type,
|
unsigned int type,
|
||||||
|
@@ -792,6 +792,81 @@ int parse_mode(const char *str_mode)
|
|||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parse_X_sub_mode(const char *X, const char *str_mode, int *result, int fail, const char *mode_desc __unused)
|
||||||
|
{
|
||||||
|
int mode = 0;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
PDEBUG("Parsing X mode: %s\n", X, str_mode);
|
||||||
|
|
||||||
|
if (!str_mode)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
p = str_mode;
|
||||||
|
while (*p) {
|
||||||
|
char current = *p;
|
||||||
|
char lower;
|
||||||
|
|
||||||
|
reeval:
|
||||||
|
switch (current) {
|
||||||
|
case COD_READ_CHAR:
|
||||||
|
PDEBUG("Parsing %s mode: found %s READ\n", X, mode_desc);
|
||||||
|
mode |= AA_DBUS_RECEIVE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COD_WRITE_CHAR:
|
||||||
|
PDEBUG("Parsing %s mode: found %s WRITE\n", X,
|
||||||
|
mode_desc);
|
||||||
|
mode |= AA_DBUS_SEND;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* error cases */
|
||||||
|
|
||||||
|
default:
|
||||||
|
lower = tolower(current);
|
||||||
|
switch (lower) {
|
||||||
|
case COD_READ_CHAR:
|
||||||
|
case COD_WRITE_CHAR:
|
||||||
|
PDEBUG("Parsing %s mode: found invalid upper case char %c\n",
|
||||||
|
X, current);
|
||||||
|
warn_uppercase();
|
||||||
|
current = lower;
|
||||||
|
goto reeval;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (fail)
|
||||||
|
yyerror(_("Internal: unexpected %s mode character '%c' in input"),
|
||||||
|
X, current);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDEBUG("Parsed %s mode: %s 0x%x\n", X, str_mode, mode);
|
||||||
|
|
||||||
|
*result = mode;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_X_mode(const char *X, int valid, const char *str_mode, int *mode, int fail)
|
||||||
|
{
|
||||||
|
*mode = 0;
|
||||||
|
if (!parse_X_sub_mode(X, str_mode, mode, fail, ""))
|
||||||
|
return 0;
|
||||||
|
if (*mode & ~valid) {
|
||||||
|
if (fail)
|
||||||
|
yyerror(_("Internal error generated invalid %s perm 0x%x\n"),
|
||||||
|
X, mode);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id)
|
struct cod_entry *new_entry(char *ns, char *id, int mode, char *link_id)
|
||||||
{
|
{
|
||||||
struct cod_entry *entry = NULL;
|
struct cod_entry *entry = NULL;
|
||||||
|
Reference in New Issue
Block a user