* [PATCH] Fixes weired looping in child_random_syscalls function.
@ 2013-10-02 23:46 Ildar Muslukhov
2013-10-03 18:33 ` Dave Jones
0 siblings, 1 reply; 3+ messages in thread
From: Ildar Muslukhov @ 2013-10-02 23:46 UTC (permalink / raw)
To: trinity; +Cc: davej
This patch removes makes the loop in child_random_syscalls aware of which
system calls are enabled, thus, avoiding unnecessary looping.
Signed-off-by: Ildar Muslukhov <ildarm@google.com>
---
children/random-syscalls.c | 36 ++--
include/constants.h | 2 +
include/shm.h | 8 +
include/syscall.h | 3 +-
tables.c | 439 ++++++++++++++++++++++++---------------------
trinity.c | 10 +-
6 files changed, 277 insertions(+), 221 deletions(-)
diff --git a/children/random-syscalls.c b/children/random-syscalls.c
index 62cef3c..a04a6e1 100644
--- a/children/random-syscalls.c
+++ b/children/random-syscalls.c
@@ -22,9 +22,15 @@
* to 'we asked to do a 32bit only syscall' and more.. Hairy.
*/
+int *active_syscalls;
+unsigned int nr_active_syscalls;
+
static void choose_syscall_table(int childno)
{
- if (biarch == TRUE) {
+ if (biarch == FALSE) {
+ active_syscalls = shm->active_syscalls;
+ nr_active_syscalls = shm->nr_active_syscalls;
+ } else if (biarch == TRUE) {
/* First, check that we have syscalls enabled in either table. */
if (validate_syscall_table_64() == FALSE) {
@@ -47,12 +53,15 @@ static void choose_syscall_table(int childno)
shm->do32bit[childno] = TRUE;
}
-
if (shm->do32bit[childno] == FALSE) {
syscalls = syscalls_64bit;
+ nr_active_syscalls = shm->nr_active_64bit_syscalls;
+ active_syscalls = shm->active_syscalls64;
max_nr_syscalls = max_nr_64bit_syscalls;
} else {
syscalls = syscalls_32bit;
+ nr_active_syscalls = shm->nr_active_32bit_syscalls;
+ active_syscalls = shm->active_syscalls32;
max_nr_syscalls = max_nr_32bit_syscalls;
}
}
@@ -97,28 +106,19 @@ int child_random_syscalls(int childno)
choose_syscall_table(childno);
- //FIXME: This 'loop' here is pretty gross. If we're just fuzzing
- // a few syscalls, we can spin here for quite a while.
- // a better way would be to do something in tables.c where we construct
- // our own syscall table just containing enabled syscalls.
-retry:
- if (no_syscalls_enabled() == TRUE) {
+ if (nr_active_syscalls == 0) {
+ printf("OOPS: no syscalls enabled\n");
shm->exit_reason = EXIT_NO_SYSCALLS_ENABLED;
goto out;
}
- if (shm->exit_reason != STILL_RUNNING)
+ if (shm->exit_reason != STILL_RUNNING) {
+ printf("Main is not running, exiting");
goto out;
+ }
- syscallnr = rand() % max_nr_syscalls;
-
- if (!(syscalls[syscallnr].entry->flags & ACTIVE))
- goto retry;
-
- if (validate_specific_syscall_silent(syscalls, syscallnr) == FALSE)
- goto retry;
-
- /* if we get here, syscallnr is finally valid */
+ syscallnr = rand() % nr_active_syscalls;
+ syscallnr = active_syscalls[syscallnr] - 1;
shm->syscallno[childno] = syscallnr;
diff --git a/include/constants.h b/include/constants.h
index 9ee7378..a57fd60 100644
--- a/include/constants.h
+++ b/include/constants.h
@@ -12,4 +12,6 @@
#define REGENERATION_POINT 100000
+#define MAX_NR_SYSCALL 1024
+
#endif /* _CONSTANTS_H */
diff --git a/include/shm.h b/include/shm.h
index 7d26ee7..0493eb0 100644
--- a/include/shm.h
+++ b/include/shm.h
@@ -22,6 +22,14 @@ struct shm_s {
unsigned int seeds[MAX_NR_CHILDREN];
unsigned int reseed_counter;
+ //Indices of syscall in syscall table that are active. All indices shifted by +1. Empty index equals to 0.
+ int active_syscalls32[MAX_NR_SYSCALL];
+ int active_syscalls64[MAX_NR_SYSCALL];
+ int active_syscalls[MAX_NR_SYSCALL];
+ unsigned int nr_active_syscalls;
+ unsigned int nr_active_32bit_syscalls;
+ unsigned int nr_active_64bit_syscalls;
+
pid_t pids[MAX_NR_CHILDREN];
unsigned char child_type[MAX_NR_CHILDREN];
diff --git a/include/syscall.h b/include/syscall.h
index faaeafc..d4b5747 100644
--- a/include/syscall.h
+++ b/include/syscall.h
@@ -35,6 +35,7 @@ struct syscall {
int (*init)(void);
unsigned int number;
+ unsigned int active_number;
const char name[80];
const unsigned int num_args;
unsigned int flags;
@@ -118,7 +119,7 @@ extern bool use_64bit;
void select_syscall_tables(void);
int search_syscall_table(const struct syscalltable *table, unsigned int nr_syscalls, const char *arg);
void mark_all_syscalls_active(void);
-void toggle_syscall(const char *arg, unsigned char state);
+void toggle_syscall(const char *arg, bool state);
void dump_syscall_tables(void);
int setup_syscall_group(unsigned int desired_group);
int validate_syscall_tables(void);
diff --git a/tables.c b/tables.c
index 32444bc..f21d8a6 100644
--- a/tables.c
+++ b/tables.c
@@ -13,6 +13,7 @@
#include "syscall.h"
#include "params.h"
#include "log.h"
+#include "shm.h"
const struct syscalltable *syscalls;
const struct syscalltable *syscalls_32bit;
@@ -69,40 +70,88 @@ int validate_specific_syscall_silent(const struct syscalltable *table, int call)
return TRUE;
}
-void count_syscalls_enabled(void)
+static void activate_syscall_in_table(unsigned int calln, unsigned int *nr_active, const struct syscalltable *table, int *active_syscall)
{
- unsigned int i;
- unsigned int ecount_32 = 0, ecount_64 = 0;
- unsigned int dcount_32 = 0, dcount_64 = 0;
+ struct syscall *call_ptr;
- if (biarch == TRUE) {
- for_each_64bit_syscall(i) {
- if (syscalls_64bit[i].entry->flags & ACTIVE)
- ecount_64++;
- else
- dcount_64++;
+ call_ptr = table[calln].entry;
+
+ //Check if the call is activated already, and activate it only if needed
+ if (call_ptr->active_number == 0) {
+ //Sanity check
+ if ((*nr_active + 1) > MAX_NR_SYSCALL) {
+ output(0, "[tables] MAX_NR_SYSCALL needs to be increased. More syscalls than active table can fit.\n");
+ exit(EXIT_FAILURE);
}
- for_each_32bit_syscall(i) {
- if (syscalls_32bit[i].entry->flags & ACTIVE)
- ecount_32++;
- else
- dcount_32++;
+ //save the call no
+ active_syscall[*nr_active] = calln + 1;
+ (*nr_active) += 1;
+ call_ptr->active_number = *nr_active;
+ }
+}
+
+static void activate_syscall32(unsigned int calln)
+{
+ activate_syscall_in_table(calln, &shm->nr_active_32bit_syscalls, syscalls_32bit, shm->active_syscalls32);
+}
+
+static void activate_syscall64(unsigned int calln)
+{
+ activate_syscall_in_table(calln, &shm->nr_active_64bit_syscalls, syscalls_64bit, shm->active_syscalls64);
+}
+
+static void activate_syscall(unsigned int calln)
+{
+ activate_syscall_in_table(calln, &shm->nr_active_syscalls, syscalls, shm->active_syscalls);
+}
+
+static void deactivate_syscall_in_table(unsigned int calln, unsigned int *nr_active, const struct syscalltable *table, int *active_syscall)
+{
+ struct syscall *call_ptr;
+
+ call_ptr = table[calln].entry;
+ //Check if the call is activated already, and deactivate it only if needed
+ if (call_ptr->active_number != 0) {
+ *nr_active -= 1;
+ if (call_ptr->active_number == *nr_active) {
+ //simple case, we are in the end
+ active_syscall[*nr_active] = 0;
+ } else {
+ //in the middle
+ active_syscall[call_ptr->active_number - 1] = active_syscall[*nr_active];
+ active_syscall[*nr_active] = 0;
}
+ call_ptr->active_number = 0;
+ }
+
+}
+
+static void deactivate_syscall32(unsigned int calln)
+{
+ deactivate_syscall_in_table(calln, &shm->nr_active_32bit_syscalls, syscalls_32bit, shm->active_syscalls32);
+}
+
+static void deactivate_syscall64(unsigned int calln)
+{
+ deactivate_syscall_in_table(calln, &shm->nr_active_64bit_syscalls, syscalls_64bit, shm->active_syscalls64);
+}
+
+static void deactivate_syscall(unsigned int calln)
+{
+ deactivate_syscall_in_table(calln, &shm->nr_active_syscalls, syscalls, shm->active_syscalls);
+}
+
+void count_syscalls_enabled(void)
+{
+ if (biarch == TRUE) {
printf("[init] 32-bit syscalls: %d enabled, %d disabled. "
"64-bit syscalls: %d enabled, %d disabled.\n",
- ecount_32, dcount_32, ecount_64, dcount_64);
-
+ shm->nr_active_32bit_syscalls, max_nr_32bit_syscalls - shm->nr_active_32bit_syscalls,
+ shm->nr_active_64bit_syscalls, max_nr_64bit_syscalls - shm->nr_active_64bit_syscalls);
} else {
-
- /* non-biarch */
- for_each_syscall(i) {
- if (syscalls[i].entry->flags & ACTIVE)
- ecount_32++;
- else
- dcount_32++;
- }
- printf("Enabled %d syscalls. Disabled %d syscalls.\n", ecount_32, dcount_32);
+ printf("Enabled %d syscalls. Disabled %d syscalls.\n",
+ shm->nr_active_syscalls, max_nr_syscalls - shm->nr_active_syscalls);
}
}
@@ -137,58 +186,44 @@ void init_syscalls(void)
bool no_syscalls_enabled(void)
{
- unsigned int i;
-
if (biarch == TRUE) {
- for_each_64bit_syscall(i) {
- if (syscalls_64bit[i].entry->flags & ACTIVE)
- return FALSE;
- }
- for_each_32bit_syscall(i) {
- if (syscalls_32bit[i].entry->flags & ACTIVE)
- return FALSE;
- }
- return TRUE;
+ if ((shm->nr_active_32bit_syscalls == 0) && (shm->nr_active_64bit_syscalls == 0))
+ return TRUE;
+ else
+ return FALSE;
}
/* non-biarch */
- for_each_syscall(i) {
- if (syscalls[i].entry->flags & ACTIVE)
- return FALSE;
- }
- return TRUE;
+ if (shm->nr_active_syscalls == 0)
+ return TRUE;
+ else
+ return FALSE;
}
int validate_syscall_table_64(void)
{
- unsigned int i;
+ if (shm->nr_active_64bit_syscalls == 0)
+ use_64bit = FALSE;
+ else
+ use_64bit = TRUE;
- for_each_64bit_syscall(i) {
- if (syscalls_64bit[i].entry->flags & ACTIVE) {
- use_64bit = TRUE;
- break;
- }
- }
return use_64bit;
}
int validate_syscall_table_32(void)
{
- unsigned int i;
+ if (shm->nr_active_32bit_syscalls == 0)
+ use_32bit = FALSE;
+ else
+ use_32bit = TRUE;
- for_each_32bit_syscall(i) {
- if (syscalls_32bit[i].entry->flags & ACTIVE) {
- use_32bit = TRUE;
- break;
- }
- }
return use_32bit;
}
/* Make sure there's at least one syscall enabled. */
int validate_syscall_tables(void)
{
- unsigned int i, ret;
+ unsigned int ret;
if (biarch == TRUE) {
ret = validate_syscall_table_32();
@@ -197,11 +232,10 @@ int validate_syscall_tables(void)
}
/* non-biarch case*/
- for_each_syscall(i) {
- if (syscalls[i].entry->flags & ACTIVE)
- return TRUE;
- }
- return FALSE;
+ if (shm->nr_active_syscalls == 0)
+ return FALSE;
+ else
+ return TRUE;
}
static void check_syscall(struct syscall *entry)
@@ -271,13 +305,19 @@ void mark_all_syscalls_active(void)
printf("Marking all syscalls as enabled.\n");
if (biarch == TRUE) {
- for_each_32bit_syscall(i)
+ for_each_32bit_syscall(i) {
syscalls_32bit[i].entry->flags |= ACTIVE;
- for_each_64bit_syscall(i)
+ activate_syscall32(i);
+ }
+ for_each_64bit_syscall(i) {
syscalls_64bit[i].entry->flags |= ACTIVE;
+ activate_syscall64(i);
+ }
} else {
- for_each_syscall(i)
+ for_each_syscall(i) {
syscalls[i].entry->flags |= ACTIVE;
+ activate_syscall(i);
+ }
}
}
@@ -324,7 +364,26 @@ static void clear_check_user_specified_arch(const char *arg, char **arg_name)
}
}
-static void toggle_syscall_biarch(const char *arg, unsigned char state)
+static void toggle_syscall_biarch_n(int calln, const struct syscalltable *table, bool onlyflag, bool doflag, bool state, void (*activate)(unsigned int), int arch_bits, const char *arg_name)
+{
+ if (calln != -1) {
+ validate_specific_syscall(table, calln);
+
+ if ((state == TRUE) && onlyflag && doflag) {
+ table[calln].entry->flags |= ACTIVE;
+ (*activate)(calln);
+ } else {
+ table[calln].entry->flags |= TO_BE_DEACTIVATED;
+ }
+ }
+
+ if ((arch_bits != 0) && (calln != -1))
+ printf("Marking %d-bit syscall %s (%d) as to be %sabled.\n",
+ arch_bits, arg_name, calln,
+ state ? "en" : "dis");
+}
+
+static void toggle_syscall_biarch(const char *arg, bool state)
{
int specific_syscall32 = 0;
int specific_syscall64 = 0;
@@ -334,30 +393,14 @@ static void toggle_syscall_biarch(const char *arg, unsigned char state)
check_user_specified_arch(arg, &arg_name, &only_64bit, &only_32bit);
- specific_syscall64 = search_syscall_table(syscalls_64bit, max_nr_64bit_syscalls, arg_name);
-
/* If we found a 64bit syscall, validate it. */
- if (specific_syscall64 != -1) {
- validate_specific_syscall(syscalls_64bit, specific_syscall64);
-
- if ((state == TRUE) && only_64bit && do_64_arch)
- syscalls_64bit[specific_syscall64].entry->flags |= ACTIVE;
- else
- syscalls_64bit[specific_syscall64].entry->flags |= TO_BE_DEACTIVATED;
- }
+ specific_syscall64 = search_syscall_table(syscalls_64bit, max_nr_64bit_syscalls, arg_name);
+ toggle_syscall_biarch_n(specific_syscall64, syscalls_64bit, only_64bit, do_64_arch, state, &activate_syscall64, 0, arg_name);
/* Search for and validate 32bit */
specific_syscall32 = search_syscall_table(syscalls_32bit, max_nr_32bit_syscalls, arg_name);
- if (specific_syscall32 != -1) {
- validate_specific_syscall(syscalls_32bit, specific_syscall32);
+ toggle_syscall_biarch_n(specific_syscall32, syscalls_32bit, only_32bit, do_32_arch, state, &activate_syscall32, 0, arg_name);
- if ((state == TRUE) && only_32bit && do_32_arch)
- syscalls_32bit[specific_syscall32].entry->flags |= ACTIVE;
- else
- syscalls_32bit[specific_syscall32].entry->flags |= TO_BE_DEACTIVATED;
- }
-
- clear_check_user_specified_arch(arg, &arg_name);
if ((!only_32bit) && (!only_64bit)) {
printf("No idea what architecture for syscall (%s) is.\n", arg);
@@ -369,11 +412,11 @@ static void toggle_syscall_biarch(const char *arg, unsigned char state)
exit(EXIT_FAILURE);
}
- /* biarch? */
if ((specific_syscall64 != -1) && (specific_syscall32 != -1)) {
printf("Marking syscall %s (64bit:%d 32bit:%d) as to be %sabled.\n",
- arg, specific_syscall64, specific_syscall32,
+ arg_name, specific_syscall64, specific_syscall32,
state ? "en" : "dis");
+ clear_check_user_specified_arch(arg, &arg_name);
return;
}
@@ -381,6 +424,7 @@ static void toggle_syscall_biarch(const char *arg, unsigned char state)
printf("Marking 64-bit syscall %s (%d) as to be %sabled.\n",
arg, specific_syscall64,
state ? "en" : "dis");
+ clear_check_user_specified_arch(arg, &arg_name);
return;
}
@@ -388,11 +432,34 @@ static void toggle_syscall_biarch(const char *arg, unsigned char state)
printf("Marking 32-bit syscall %s (%d) as to be %sabled.\n",
arg, specific_syscall32,
state ? "en" : "dis");
+ clear_check_user_specified_arch(arg, &arg_name);
return;
}
+
+}
+
+static void toggle_syscall_n(int calln, bool state, const char *arg, const char *arg_name)
+{
+ if (calln == -1) {
+ printf("No idea what syscall (%s) is.\n", arg);
+ exit(EXIT_FAILURE);
+ }
+
+ validate_specific_syscall(syscalls, calln);
+
+ if (state == TRUE) {
+ syscalls[calln].entry->flags |= ACTIVE;
+ activate_syscall(calln);
+ } else {
+ syscalls[calln].entry->flags |= TO_BE_DEACTIVATED;
+ }
+
+ printf("Marking syscall %s (%d) as to be %sabled.\n",
+ arg_name, calln,
+ state ? "en" : "dis");
}
-void toggle_syscall(const char *arg, unsigned char state)
+void toggle_syscall(const char *arg, bool state)
{
int specific_syscall = 0;
char * arg_name = NULL;
@@ -405,22 +472,8 @@ void toggle_syscall(const char *arg, unsigned char state)
/* non-biarch case. */
check_user_specified_arch(arg, &arg_name, NULL, NULL); //We do not care about arch here, just to get rid of arg flags.
specific_syscall = search_syscall_table(syscalls, max_nr_syscalls, arg_name);
+ toggle_syscall_n(specific_syscall, state, arg, arg_name);
clear_check_user_specified_arch(arg, &arg_name);
-
- if (specific_syscall == -1) {
- printf("No idea what syscall (%s) is.\n", arg_name);
- exit(EXIT_FAILURE);
- }
-
- validate_specific_syscall(syscalls, specific_syscall);
-
- if (state == TRUE)
- syscalls[specific_syscall].entry->flags |= ACTIVE;
- else
- syscalls[specific_syscall].entry->flags |= TO_BE_DEACTIVATED;
-
- printf("Marking syscall %s (%d) as to be %sabled.\n", arg, specific_syscall,
- state ? "en" : "dis");
}
void deactivate_disabled_syscalls(void)
@@ -433,6 +486,7 @@ void deactivate_disabled_syscalls(void)
for_each_64bit_syscall(i) {
if (syscalls_64bit[i].entry->flags & TO_BE_DEACTIVATED) {
syscalls_64bit[i].entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
+ deactivate_syscall64(i);
printf("Marked 64-bit syscall %s (%d) as deactivated.\n",
syscalls_64bit[i].entry->name, syscalls_64bit[i].entry->number);
}
@@ -440,6 +494,7 @@ void deactivate_disabled_syscalls(void)
for_each_32bit_syscall(i) {
if (syscalls_32bit[i].entry->flags & TO_BE_DEACTIVATED) {
syscalls_32bit[i].entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
+ deactivate_syscall32(i);
printf("Marked 32-bit syscall %s (%d) as deactivated.\n",
syscalls_32bit[i].entry->name, syscalls_32bit[i].entry->number);
}
@@ -449,6 +504,7 @@ void deactivate_disabled_syscalls(void)
for_each_syscall(i) {
if (syscalls[i].entry->flags & TO_BE_DEACTIVATED) {
syscalls[i].entry->flags &= ~(ACTIVE|TO_BE_DEACTIVATED);
+ deactivate_syscall(i);
printf("Marked syscall %s (%d) as deactivated.\n",
syscalls[i].entry->name, syscalls[i].entry->number);
}
@@ -515,6 +571,7 @@ static struct syscalltable * copy_syscall_table(struct syscalltable *from, unsig
for (n = 0; n < nr; n++) {
memcpy(copy + n , from[n].entry, sizeof(struct syscall));
copy[n].number = n;
+ copy[n].active_number = 0;
from[n].entry = ©[n];
}
return from;
@@ -565,94 +622,48 @@ void select_syscall_tables(void)
}
-
int setup_syscall_group(unsigned int group)
{
- struct syscalltable *newsyscalls;
- struct syscalltable *newsyscalls32;
- struct syscalltable *newsyscalls64;
-
unsigned int i;
- int count = 0, j = 0;
if (biarch == TRUE) {
for_each_32bit_syscall(i) {
if (syscalls_32bit[i].entry->group == group)
- count++;
+ activate_syscall32(i);
}
- if (count == 0) {
+ if (shm->nr_active_32bit_syscalls == 0) {
printf("No 32-bit syscalls in group\n");
- goto try_64bit;
- }
-
- newsyscalls32 = malloc(count * sizeof(struct syscalltable));
- if (newsyscalls32 == NULL)
- return FALSE;
-
- for_each_32bit_syscall(i) {
- if (syscalls_32bit[i].entry->group == group)
- newsyscalls32[j++].entry = syscalls_32bit[i].entry;
+ } else {
+ printf("Found %d 32-bit syscalls in group\n", shm->nr_active_32bit_syscalls);
}
- max_nr_32bit_syscalls = count;
- syscalls_32bit = newsyscalls32;
-
- printf("Found %d 32-bit syscalls in group\n", max_nr_32bit_syscalls);
-
-try_64bit:
/* now the 64 bit table*/
- count = 0, j = 0;
-
for_each_64bit_syscall(i) {
if (syscalls_64bit[i].entry->group == group)
- count++;
+ activate_syscall64(i);
}
- if (count == 0) {
+ if (shm->nr_active_64bit_syscalls == 0) {
printf("No 64-bit syscalls in group\n");
return FALSE;
+ } else {
+ printf("Found %d 64-bit syscalls in group\n", shm->nr_active_64bit_syscalls);
}
- newsyscalls64 = malloc(count * sizeof(struct syscalltable));
- if (newsyscalls64 == NULL)
- return FALSE;
-
- for_each_64bit_syscall(i) {
- if (syscalls_64bit[i].entry->group == group)
- newsyscalls64[j++].entry = syscalls_64bit[i].entry;
- }
-
- max_nr_64bit_syscalls = count;
- syscalls_64bit = newsyscalls64;
- printf("Found %d 64-bit syscalls in group\n", max_nr_32bit_syscalls);
-
} else {
/* non-biarch case. */
-
for_each_syscall(i) {
if (syscalls[i].entry->group == group)
- count++;
+ activate_syscall(i);
}
- if (count == 0) {
+ if (shm->nr_active_syscalls == 0) {
printf("No syscalls found in group\n");
return FALSE;
+ } else {
+ printf("Found %d syscalls in group\n", shm->nr_active_syscalls);
}
-
- newsyscalls = malloc(count * sizeof(struct syscalltable));
- if (newsyscalls == NULL)
- exit(EXIT_FAILURE);
-
- for_each_syscall(i) {
- if (syscalls[i].entry->group == group)
- newsyscalls[j++].entry = syscalls[i].entry;
- }
-
- max_nr_syscalls = count;
- syscalls = newsyscalls;
-
- printf("Found %d syscalls in group\n", max_nr_syscalls);
}
return TRUE;
@@ -684,16 +695,6 @@ const char * print_syscall_name(unsigned int callno, bool is32bit)
return table[callno].entry->name;
}
-// FIXME: in the biarch=TRUE case, we ignore 32bit for now
-static const char * lookup_name(unsigned int num)
-{
- if (biarch == TRUE) {
- return syscalls_64bit[num].entry->name;
- }
-
- return syscalls[num].entry->name;
-}
-
void display_enabled_syscalls(void)
{
unsigned int i;
@@ -761,7 +762,6 @@ static bool is_syscall_net_related(const struct syscalltable *table, unsigned in
void disable_non_net_syscalls(void)
{
- const char *syscallname;
unsigned int i;
printf("Disabling non networking related syscalls\n");
@@ -773,8 +773,8 @@ void disable_non_net_syscalls(void)
if (syscalls_64bit[i].entry->flags & ACTIVE) {
if (is_syscall_net_related(syscalls_64bit, i) == FALSE) {
- syscallname = lookup_name(i);
- toggle_syscall_biarch(syscallname, FALSE);
+ toggle_syscall_biarch_n(i, syscalls_64bit, FALSE, do_64_arch, FALSE,
+ &activate_syscall64, 64, syscalls_64bit[i].entry->name);
}
}
}
@@ -785,8 +785,8 @@ void disable_non_net_syscalls(void)
if (syscalls_32bit[i].entry->flags & ACTIVE) {
if (is_syscall_net_related(syscalls_32bit, i) == FALSE) {
- syscallname = syscalls_32bit[i].entry->name;
- toggle_syscall_biarch(syscallname, FALSE);
+ toggle_syscall_biarch_n(i, syscalls_32bit, FALSE, do_32_arch, FALSE,
+ &activate_syscall32, 32, syscalls_32bit[i].entry->name);
}
}
}
@@ -799,8 +799,7 @@ void disable_non_net_syscalls(void)
if (syscalls[i].entry->flags & ACTIVE) {
if (is_syscall_net_related(syscalls, i) == FALSE) {
- syscallname = lookup_name(i);
- toggle_syscall(syscallname, FALSE);
+ toggle_syscall_n(i, FALSE, syscalls[i].entry->name, syscalls[i].entry->name);
}
}
}
@@ -814,8 +813,9 @@ void disable_non_net_syscalls(void)
void enable_random_syscalls(void)
{
unsigned int i;
- const char *syscallname;
- unsigned int call, call32, call64;
+ unsigned int call, call32, call64, callnotfound;
+
+ callnotfound = (unsigned int)-1;
if (random_selection_num == 0) {
printf("-r 0 syscalls ? what?\n");
@@ -823,7 +823,7 @@ void enable_random_syscalls(void)
}
if (biarch == TRUE) {
- if (random_selection_num > max_nr_64bit_syscalls) {
+ if ((random_selection_num > max_nr_64bit_syscalls) && do_64_arch) {
printf("-r val %d out of range (1-%d)\n", random_selection_num, max_nr_64bit_syscalls);
exit(EXIT_FAILURE);
}
@@ -840,26 +840,67 @@ void enable_random_syscalls(void)
retry:
if (biarch == TRUE) {
- call64 = rand() % max_nr_64bit_syscalls;
- syscallname = lookup_name(call64);
- call32 = search_syscall_table(syscalls_32bit, max_nr_32bit_syscalls, syscallname);
-
- if (validate_specific_syscall_silent(syscalls_64bit, call64) == FALSE)
- goto retry;
- if (validate_specific_syscall_silent(syscalls_32bit, call32) == FALSE)
- goto retry;
+ call64 = callnotfound;
+ call32 = callnotfound;
- if (no_files == TRUE) {
- if (is_syscall_net_related(syscalls_64bit, call64) == FALSE)
- goto retry;
- if (is_syscall_net_related(syscalls_32bit, call32) == FALSE)
+ //Search for 64 bit version
+ if (do_64_arch) {
+ call64 = rand() % max_nr_64bit_syscalls;
+ if (validate_specific_syscall_silent(syscalls_64bit, call64) == FALSE)
goto retry;
+
+ if (no_files == TRUE)
+ if (is_syscall_net_related(syscalls_64bit, call64) == FALSE)
+ goto retry;
+
+ if (syscalls_64bit[call64].entry->flags & TO_BE_DEACTIVATED)
+ goto try32bit;
+
+ //If we got so far, then active it.
+ toggle_syscall_biarch_n(i, syscalls_64bit, TRUE, do_64_arch, TRUE,
+ &activate_syscall64, 64, syscalls_64bit[call64].entry->name);
+ }
+try32bit:
+ //Search for 32 bit version
+ if (do_32_arch) {
+
+ if (do_64_arch) {
+ call32 = search_syscall_table(syscalls_32bit, max_nr_32bit_syscalls, syscalls_64bit[call64].entry->name);
+ if (syscalls_64bit[call64].entry->flags & TO_BE_DEACTIVATED)
+ call64 = callnotfound; //mark as not found in order not to increment i.
+ } else {
+ call32 = rand() % max_nr_32bit_syscalls;
+ }
+
+ if (validate_specific_syscall_silent(syscalls_32bit, call32) == FALSE) {
+ if (call64 == callnotfound)
+ goto retry;
+ else
+ continue;
+ }
+
+ if (no_files == TRUE)
+ if (is_syscall_net_related(syscalls_64bit, call64) == FALSE) {
+ if (call64 == callnotfound)
+ goto retry;
+ else
+ continue;
+ }
+
+ if (syscalls_64bit[call64].entry->flags & TO_BE_DEACTIVATED) {
+ if (call64 == callnotfound)
+ goto retry;
+ else
+ continue;
+ }
+
+ //If we got so far, then active it.
+ toggle_syscall_biarch_n(i, syscalls_32bit, TRUE, do_32_arch, TRUE,
+ &activate_syscall32, 32, syscalls_32bit[call32].entry->name);
}
- if (syscalls_64bit[call64].entry->flags & TO_BE_DEACTIVATED)
- goto retry;
- if (syscalls_32bit[call32].entry->flags & TO_BE_DEACTIVATED)
- goto retry;
+
+
} else {
call = rand() % max_nr_syscalls;
@@ -875,9 +916,7 @@ retry:
if (syscalls[call].entry->flags & TO_BE_DEACTIVATED)
goto retry;
- syscallname = lookup_name(call);
+ toggle_syscall_n(call, FALSE, syscalls[call].entry->name, syscalls[call].entry->name);
}
-
- toggle_syscall(syscallname, TRUE);
}
}
diff --git a/trinity.c b/trinity.c
index a72484e..73627cf 100644
--- a/trinity.c
+++ b/trinity.c
@@ -69,6 +69,13 @@ static int create_shm(void)
memset(shm->pids, EMPTY_PIDSLOT, sizeof(shm->pids));
+ shm->nr_active_syscalls = 0;
+ shm->nr_active_32bit_syscalls = 0;
+ shm->nr_active_64bit_syscalls = 0;
+ memset(shm->active_syscalls, 0, sizeof(shm->active_syscalls));
+ memset(shm->active_syscalls32, 0, sizeof(shm->active_syscalls32));
+ memset(shm->active_syscalls64, 0, sizeof(shm->active_syscalls64));
+
/* Overwritten later in setup_shm_postargs if user passed -s */
shm->seed = new_seed();
@@ -105,7 +112,7 @@ static int munge_tables(void)
/* By default, all syscall entries will be disabled.
* If we didn't pass -c, -x or -r, mark all syscalls active.
*/
- if ((do_specific_syscall == FALSE) && (do_exclude_syscall == FALSE) && (random_selection == FALSE))
+ if ((do_specific_syscall == FALSE) && (do_exclude_syscall == FALSE) && (random_selection == FALSE) && (desired_group == GROUP_NONE))
mark_all_syscalls_active();
if (desired_group != GROUP_NONE) {
@@ -123,7 +130,6 @@ static int munge_tables(void)
if (do_exclude_syscall == TRUE) {
if (random_selection == FALSE)
mark_all_syscalls_active();
-
deactivate_disabled_syscalls();
}
--
1.8.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] Fixes weired looping in child_random_syscalls function.
2013-10-02 23:46 [PATCH] Fixes weired looping in child_random_syscalls function Ildar Muslukhov
@ 2013-10-03 18:33 ` Dave Jones
[not found] ` <CAEGbLtvYzMHJvEw+BnPj3449ZuNuyxYe3V=5e3VyMpjDwFW47w@mail.gmail.com>
0 siblings, 1 reply; 3+ messages in thread
From: Dave Jones @ 2013-10-03 18:33 UTC (permalink / raw)
To: Ildar Muslukhov; +Cc: trinity
On Wed, Oct 02, 2013 at 04:46:41PM -0700, Ildar Muslukhov wrote:
>
> This patch removes makes the loop in child_random_syscalls aware of which
> system calls are enabled, thus, avoiding unnecessary looping.
>
> Signed-off-by: Ildar Muslukhov <ildarm@google.com>
I knew I should have tested this before merging it..
This seems all kinds of broken:
$ ./trinity -l off -q
Trinity v1.3pre Dave Jones <davej@redhat.com>
Done parsing arguments.
Marking all syscalls as enabled.
[init] 32-bit syscalls: 351 enabled, 0 disabled. 64-bit syscalls: 314 enabled, 0 disabled.
[init] Using pid_max = 32768
[init] Started watchdog process, PID is 29722
[watchdog] Watchdog is alive. (pid:29722)
[main] Main thread is alive.
[main] 375 sockets created based on info from socket cachefile.
[main] Generating file descriptors
[main] Added 48 filenames from /dev
[main] Added 28849 filenames from /proc
[main] Added 14258 filenames from /sys
[child3:29727] uselib (134) returned ENOSYS, marking as inactive.
[child3:29729] ni_syscall (generic) (185) returned ENOSYS, marking as inactive.
[child3:29729] nfsservctl (180) returned ENOSYS, marking as inactive.
[child3:29729] nfsservctl (180) returned ENOSYS, marking as inactive.
[child3:29729] ni_syscall (generic) (182) returned ENOSYS, marking as inactive.
[child-1:29729] ni_syscall (generic) (177) returned ENOSYS, marking as inactive.
[child0:29724] ni_syscall (generic) (215) returned ENOSYS, marking as inactive.
[child1:29725] ni_syscall (generic) (182) returned ENOSYS, marking as inactive.
[child2:29726] ni_syscall (generic) (177) returned ENOSYS, marking as inactive.
[child3:29732] ni_syscall (generic) (214) returned ENOSYS, marking as inactive.
[child1:29739] ni_syscall (generic) (211) returned ENOSYS, marking as inactive.
[child1:29739] ni_syscall (generic) (181) returned ENOSYS, marking as inactive.
[child1:29739] ni_syscall (generic) (185) returned ENOSYS, marking as inactive.
[child2:29742] ni_syscall (generic) (205) returned ENOSYS, marking as inactive.
[child1:29750] ni_syscall (generic) (181) returned ENOSYS, marking as inactive.
[child1:29752] ni_syscall (generic) (236) returned ENOSYS, marking as inactive.
[child1:29754] ni_syscall (generic) (181) returned ENOSYS, marking as inactive.
[child2:29755] ni_syscall (generic) (211) returned ENOSYS, marking as inactive.
[child2:29755] ni_syscall (generic) (185) returned ENOSYS, marking as inactive.
[child1:29756] ni_syscall (generic) (185) returned ENOSYS, marking as inactive.
[child3:29757] ni_syscall (generic) (215) returned ENOSYS, marking as inactive.
[child1:29758] BUG!: CHILD (pid:29758) GOT REPARENTED! parent pid:29723. Watchdog pid:29722
[child1:29758] BUG!: Last syscalls:
[child1:29758] [0] pid:29733 call:fcntl callno:5
[child1:29758] [1] pid:29758 call:timer_create callno:9
[child1:29758] [2] pid:29755 call:fchownat callno:24
[child1:29758] [3] pid:29757 call:fchdir callno:10
[child-1:29757] child exiting.
1. "child-1" looks suspect
2. There's a lot more ni_syscall's there than there should be.
3. The reparent thing.
Running with -D shows lots of segv's.
Dave
`
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-10-03 20:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-02 23:46 [PATCH] Fixes weired looping in child_random_syscalls function Ildar Muslukhov
2013-10-03 18:33 ` Dave Jones
[not found] ` <CAEGbLtvYzMHJvEw+BnPj3449ZuNuyxYe3V=5e3VyMpjDwFW47w@mail.gmail.com>
2013-10-03 20:12 ` Ildar Muslukhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox