summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Moore <pmoore@redhat.com>2014-08-22 14:57:48 -0400
committerPaul Moore <pmoore@redhat.com>2014-08-27 10:43:11 -0400
commit4dd234df40d0c228f5fe40fa45b05afb36e607f1 (patch)
tree59d2d01f19b8ba02bf504f4f1494a3dd00cdbee7
parentc188588835d060e41e484e7b7ad4a78e7282b33e (diff)
downloadlibseccomp-4dd234df40d0c228f5fe40fa45b05afb36e607f1.tar.gz
arch: perform a number of simplications in the arch code
I've been putting off simplifing the arch specific code until we had enough ABIs to know what simplifications made sense. Well, our supported ABI list is not quite reasonable so go ahead and clean things up a bit. Signed-off-by: Paul Moore <pmoore@redhat.com>
-rw-r--r--src/arch-aarch64.h6
-rw-r--r--src/arch-arm.h4
-rw-r--r--src/arch-mips.h5
-rw-r--r--src/arch-mips64.h10
-rw-r--r--src/arch-mips64n32.h5
-rw-r--r--src/arch-x32.h4
-rw-r--r--src/arch-x86.c9
-rw-r--r--src/arch-x86.h4
-rw-r--r--src/arch-x86_64.h6
-rw-r--r--src/arch.c110
10 files changed, 34 insertions, 129 deletions
diff --git a/src/arch-aarch64.h b/src/arch-aarch64.h
index 9d80311..ddfb111 100644
--- a/src/arch-aarch64.h
+++ b/src/arch-aarch64.h
@@ -27,14 +27,8 @@
#include "arch.h"
#include "system.h"
-#define aarch64_arg_count_max 6
-
extern const struct arch_def arch_def_aarch64;
-#define aarch64_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-#define aarch64_arg_offset_lo(x) (aarch64_arg_offset(x))
-#define aarch64_arg_offset_hi(x) (aarch64_arg_offset(x) + 4)
-
int aarch64_syscall_resolve_name(const char *name);
const char *aarch64_syscall_resolve_num(int num);
diff --git a/src/arch-arm.h b/src/arch-arm.h
index 4ffa167..dc93997 100644
--- a/src/arch-arm.h
+++ b/src/arch-arm.h
@@ -27,12 +27,8 @@
#include "arch.h"
#include "system.h"
-#define arm_arg_count_max 6
-
extern const struct arch_def arch_def_arm;
-#define arm_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-
int arm_syscall_resolve_name(const char *name);
const char *arm_syscall_resolve_num(int num);
diff --git a/src/arch-mips.h b/src/arch-mips.h
index 02ca347..cce1a17 100644
--- a/src/arch-mips.h
+++ b/src/arch-mips.h
@@ -28,14 +28,9 @@
#include "arch.h"
#include "system.h"
-#define mips_arg_count_max 6
-
extern const struct arch_def arch_def_mips;
extern const struct arch_def arch_def_mipsel;
-#define mips_arg_offset(x) (offsetof(struct seccomp_data, args[x]) + 4)
-#define mipsel_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-
int mips_syscall_resolve_name(const char *name);
const char *mips_syscall_resolve_num(int num);
diff --git a/src/arch-mips64.h b/src/arch-mips64.h
index 662ba51..05f388b 100644
--- a/src/arch-mips64.h
+++ b/src/arch-mips64.h
@@ -28,19 +28,9 @@
#include "arch.h"
#include "system.h"
-#define mips64_arg_count_max 6
-
extern const struct arch_def arch_def_mips64;
extern const struct arch_def arch_def_mipsel64;
-#define mips64_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-#define mips64_arg_offset_lo(x) (mips64_arg_offset(x) + 4)
-#define mips64_arg_offset_hi(x) (mips64_arg_offset(x))
-
-#define mipsel64_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-#define mipsel64_arg_offset_lo(x) (mipsel64_arg_offset(x))
-#define mipsel64_arg_offset_hi(x) (mipsel64_arg_offset(x) + 4)
-
int mips64_syscall_resolve_name(const char *name);
const char *mips64_syscall_resolve_num(int num);
diff --git a/src/arch-mips64n32.h b/src/arch-mips64n32.h
index 441e646..c712432 100644
--- a/src/arch-mips64n32.h
+++ b/src/arch-mips64n32.h
@@ -28,14 +28,9 @@
#include "arch.h"
#include "system.h"
-#define mips64n32_arg_count_max 6
-
extern const struct arch_def arch_def_mips64n32;
extern const struct arch_def arch_def_mipsel64n32;
-#define mips64n32_arg_offset(x) (offsetof(struct seccomp_data, args[x]) + 4)
-#define mipsel64n32_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-
int mips64n32_syscall_resolve_name(const char *name);
const char *mips64n32_syscall_resolve_num(int num);
diff --git a/src/arch-x32.h b/src/arch-x32.h
index cdcea00..9d6c5b3 100644
--- a/src/arch-x32.h
+++ b/src/arch-x32.h
@@ -29,12 +29,8 @@
#define X32_SYSCALL_BIT 0x40000000
-#define x32_arg_count_max 6
-
extern const struct arch_def arch_def_x32;
-#define x32_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-
int x32_syscall_resolve_name(const char *name);
const char *x32_syscall_resolve_num(int num);
diff --git a/src/arch-x86.c b/src/arch-x86.c
index 66e72dc..1b4f2a9 100644
--- a/src/arch-x86.c
+++ b/src/arch-x86.c
@@ -82,9 +82,14 @@ int x86_filter_rewrite(const struct arch_def *arch, bool strict,
int *syscall, struct db_api_arg *chain)
{
unsigned int iter;
+ int arg_max;
+
+ arg_max = arch_arg_count_max(arch);
+ if (arg_max < 0)
+ return arg_max;
if ((*syscall) <= -100 && (*syscall) >= -117) {
- for (iter = 0; iter < x86_arg_count_max; iter++) {
+ for (iter = 0; iter < arg_max; iter++) {
if ((chain[iter].valid != 0) && (strict))
return -EINVAL;
}
@@ -95,7 +100,7 @@ int x86_filter_rewrite(const struct arch_def *arch, bool strict,
chain[0].valid = 1;
*syscall = __x86_NR_socketcall;
} else if ((*syscall) <= -200 && (*syscall) >= -211) {
- for (iter = 0; iter < x86_arg_count_max; iter++) {
+ for (iter = 0; iter < arg_max; iter++) {
if ((chain[iter].valid != 0) && (strict))
return -EINVAL;
}
diff --git a/src/arch-x86.h b/src/arch-x86.h
index 9461f3d..163d0ed 100644
--- a/src/arch-x86.h
+++ b/src/arch-x86.h
@@ -28,12 +28,8 @@
#include "db.h"
#include "system.h"
-#define x86_arg_count_max 6
-
extern const struct arch_def arch_def_x86;
-#define x86_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-
int x86_syscall_resolve_name(const char *name);
const char *x86_syscall_resolve_num(int num);
diff --git a/src/arch-x86_64.h b/src/arch-x86_64.h
index babb049..c74e0c6 100644
--- a/src/arch-x86_64.h
+++ b/src/arch-x86_64.h
@@ -27,14 +27,8 @@
#include "arch.h"
#include "system.h"
-#define x86_64_arg_count_max 6
-
extern const struct arch_def arch_def_x86_64;
-#define x86_64_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
-#define x86_64_arg_offset_lo(x) (x86_64_arg_offset(x))
-#define x86_64_arg_offset_hi(x) (x86_64_arg_offset(x) + 4)
-
int x86_64_syscall_resolve_name(const char *name);
const char *x86_64_syscall_resolve_num(int num);
diff --git a/src/arch.c b/src/arch.c
index 12acfbf..e29b579 100644
--- a/src/arch.c
+++ b/src/arch.c
@@ -40,6 +40,10 @@
#include "arch-mips64n32.h"
#include "system.h"
+#define default_arg_count_max 6
+
+#define default_arg_offset(x) (offsetof(struct seccomp_data, args[x]))
+
#if __i386__
const struct arch_def *arch_def_native = &arch_def_x86;
#elif __x86_64__
@@ -83,22 +87,7 @@ const struct arch_def *arch_def_native = &arch_def_mipsel64n32;
*/
int arch_valid(uint32_t arch)
{
- switch (arch) {
- case SCMP_ARCH_X86:
- case SCMP_ARCH_X86_64:
- case SCMP_ARCH_X32:
- case SCMP_ARCH_ARM:
- case SCMP_ARCH_MIPS:
- case SCMP_ARCH_MIPSEL:
- case SCMP_ARCH_MIPS64:
- case SCMP_ARCH_MIPSEL64:
- case SCMP_ARCH_MIPS64N32:
- case SCMP_ARCH_MIPSEL64N32:
- case SCMP_ARCH_AARCH64:
- return 0;
- }
-
- return -EINVAL;
+ return (arch_def_lookup(arch) ? 0 : -EINVAL);
}
/**
@@ -183,29 +172,7 @@ const struct arch_def *arch_def_lookup_name(const char *arch_name)
*/
int arch_arg_count_max(const struct arch_def *arch)
{
- switch (arch->token) {
- case SCMP_ARCH_X86:
- return x86_arg_count_max;
- case SCMP_ARCH_X86_64:
- return x86_64_arg_count_max;
- case SCMP_ARCH_X32:
- return x32_arg_count_max;
- case SCMP_ARCH_ARM:
- return arm_arg_count_max;
- case SCMP_ARCH_AARCH64:
- return aarch64_arg_count_max;
- case SCMP_ARCH_MIPS:
- case SCMP_ARCH_MIPSEL:
- return mips_arg_count_max;
- case SCMP_ARCH_MIPS64:
- case SCMP_ARCH_MIPSEL64:
- return mips64_arg_count_max;
- case SCMP_ARCH_MIPS64N32:
- case SCMP_ARCH_MIPSEL64N32:
- return mips64n32_arg_count_max;
- }
-
- return -EDOM;
+ return (arch_valid(arch->token) == 0 ? default_arg_count_max : -EDOM);
}
/**
@@ -220,15 +187,16 @@ int arch_arg_count_max(const struct arch_def *arch)
*/
int arch_arg_offset_lo(const struct arch_def *arch, unsigned int arg)
{
- switch (arch->token) {
- case SCMP_ARCH_X86_64:
- return x86_64_arg_offset_lo(arg);
- case SCMP_ARCH_AARCH64:
- return aarch64_arg_offset_lo(arg);
- case SCMP_ARCH_MIPS64:
- return mips64_arg_offset_lo(arg);
- case SCMP_ARCH_MIPSEL64:
- return mipsel64_arg_offset_lo(arg);
+ if (arch_valid(arch->token) < 0)
+ return -EDOM;
+
+ switch (arch->endian) {
+ case ARCH_ENDIAN_LITTLE:
+ return default_arg_offset(arg);
+ break;
+ case ARCH_ENDIAN_BIG:
+ return default_arg_offset(arg) + 4;
+ break;
default:
return -EDOM;
}
@@ -246,15 +214,16 @@ int arch_arg_offset_lo(const struct arch_def *arch, unsigned int arg)
*/
int arch_arg_offset_hi(const struct arch_def *arch, unsigned int arg)
{
- switch (arch->token) {
- case SCMP_ARCH_X86_64:
- return x86_64_arg_offset_hi(arg);
- case SCMP_ARCH_AARCH64:
- return aarch64_arg_offset_hi(arg);
- case SCMP_ARCH_MIPS64:
- return mips64_arg_offset_hi(arg);
- case SCMP_ARCH_MIPSEL64:
- return mipsel64_arg_offset_hi(arg);
+ if (arch_valid(arch->token) < 0 || arch->size != ARCH_SIZE_64)
+ return -EDOM;
+
+ switch (arch->endian) {
+ case ARCH_ENDIAN_LITTLE:
+ return default_arg_offset(arg) + 4;
+ break;
+ case ARCH_ENDIAN_BIG:
+ return default_arg_offset(arg);
+ break;
default:
return -EDOM;
}
@@ -272,32 +241,7 @@ int arch_arg_offset_hi(const struct arch_def *arch, unsigned int arg)
*/
int arch_arg_offset(const struct arch_def *arch, unsigned int arg)
{
- switch (arch->token) {
- case SCMP_ARCH_X86:
- return x86_arg_offset(arg);
- case SCMP_ARCH_X86_64:
- return x86_64_arg_offset(arg);
- case SCMP_ARCH_X32:
- return x32_arg_offset(arg);
- case SCMP_ARCH_ARM:
- return arm_arg_offset(arg);
- case SCMP_ARCH_AARCH64:
- return aarch64_arg_offset(arg);
- case SCMP_ARCH_MIPS:
- return mips_arg_offset(arg);
- case SCMP_ARCH_MIPSEL:
- return mipsel_arg_offset(arg);
- case SCMP_ARCH_MIPS64:
- return mips64_arg_offset(arg);
- case SCMP_ARCH_MIPSEL64:
- return mipsel64_arg_offset(arg);
- case SCMP_ARCH_MIPS64N32:
- return mips64n32_arg_offset(arg);
- case SCMP_ARCH_MIPSEL64N32:
- return mipsel64n32_arg_offset(arg);
- default:
- return -EDOM;
- }
+ return arch_arg_offset_lo(arch, arg);
}
/**