This is necessary for x32 support.

Signed-off-by: Paul Moore <[email protected]>
---
 src/gen_bpf.c |   42 ++++++++++++++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/gen_bpf.c b/src/gen_bpf.c
index b1287e5..52d4a42 100644
--- a/src/gen_bpf.c
+++ b/src/gen_bpf.c
@@ -1065,15 +1065,17 @@ static struct bpf_blk *_gen_bpf_syscall(struct 
bpf_state *state,
  * Generate the BPF instruction blocks for a given filter/architecture
  * @param state the BPF state
  * @param db the filter DB
+ * @param db_secondary the secondary DB
  *
- * Generate the BPF instruction block for the given filter DB/architecture and
- * return a pointer to the block on succes, NULL on failure.  The resulting
+ * Generate the BPF instruction block for the given filter 
DB(s)/architecture(s)
+ * and return a pointer to the block on succes, NULL on failure.  The resulting
  * block assumes that the architecture token has already been loaded into the
  * BPF accumulator.
  *
  */
 static struct bpf_blk *_gen_bpf_arch(struct bpf_state *state,
-                                    const struct db_filter *db)
+                                    const struct db_filter *db,
+                                    const struct db_filter *db_secondary)
 {
        int rc;
        unsigned int blk_cnt = 0;
@@ -1114,6 +1116,38 @@ static struct bpf_blk *_gen_bpf_arch(struct bpf_state 
*state,
                        s_head->pri_nxt = NULL;
                }
        }
+       if (db_secondary != NULL) {
+               db_list_foreach(s_iter, db_secondary->syscalls) {
+                       if (s_head != NULL) {
+                               s_iter_b = s_head;
+                               while ((s_iter_b->pri_nxt != NULL) &&
+                               (s_iter->priority <= s_iter_b->priority))
+                                       s_iter_b = s_iter_b->pri_nxt;
+
+                               if (s_iter->priority > s_iter_b->priority) {
+                                       s_iter->pri_prv = s_iter_b->pri_prv;
+                                       s_iter->pri_nxt = s_iter_b;
+                                       if (s_iter_b == s_head) {
+                                               s_head->pri_prv = s_iter;
+                                               s_head = s_iter;
+                                       } else {
+                                               s_iter->pri_prv->pri_nxt=s_iter;
+                                               s_iter->pri_nxt->pri_prv=s_iter;
+                                       }
+                               } else {
+                                       s_iter->pri_prv = s_tail;
+                                       s_iter->pri_nxt = NULL;
+                                       s_iter->pri_prv->pri_nxt = s_iter;
+                                       s_tail = s_iter;
+                               }
+                       } else {
+                               s_head = s_iter;
+                               s_tail = s_iter;
+                               s_head->pri_prv = NULL;
+                               s_head->pri_nxt = NULL;
+                       }
+               }
+       }
 
        /* create the syscall filters and add them to block list group */
        for (s_iter = s_tail; s_iter != NULL; s_iter = s_iter->pri_prv) {
@@ -1417,7 +1451,7 @@ static int _gen_bpf_build_bpf(struct bpf_state *state,
 
        /* generate the per-architecture filters */
        for (iter = 0; iter < col->filter_cnt; iter++) {
-               b_new = _gen_bpf_arch(state, col->filters[iter]);
+               b_new = _gen_bpf_arch(state, col->filters[iter], NULL);
                if (b_new == NULL)
                        return -ENOMEM;
                b_new->prev = b_tail;


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
libseccomp-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libseccomp-discuss

Reply via email to