Add EPERM and ENOMEM errno tests for mlock(2).
Signed-off-by: Zeng Linggang <[email protected]>
---
testcases/kernel/syscalls/mlock/mlock02.c | 88 ++++++++++++++++++++++++++++---
1 file changed, 81 insertions(+), 7 deletions(-)
diff --git a/testcases/kernel/syscalls/mlock/mlock02.c
b/testcases/kernel/syscalls/mlock/mlock02.c
index 1d1c853..6ccd281 100644
--- a/testcases/kernel/syscalls/mlock/mlock02.c
+++ b/testcases/kernel/syscalls/mlock/mlock02.c
@@ -20,13 +20,22 @@
* ALGORITHM
* test 1:
* Call mlock with a NULL address. ENOMEM should be returned
+ * test 2:
+ * The caller was not privileged and its RLIMIT_MEMLOCK soft
+ * resource limit was 0. EPERM should be returned
+ * test 3:
+ * The caller was not privileged and its RLIMIT_MEMLOCK soft
+ * resource limit was nonzero, but tried to lock more memory than
+ * the limit permitted. ENOMEM should be returned
*/
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <pwd.h>
#include "test.h"
#include "usctest.h"
+#include "safe_macros.h"
char *TCID = "mlock02";
@@ -36,25 +45,32 @@ struct test_case_t {
void **addr;
int len;
int error;
- void (*setupfunc) ();
+ int (*setupfunc) ();
+ void (*cleanupfunc) ();
};
static void *addr1;
+static struct passwd *ltpuser;
static void setup(void);
#ifdef __ia64__
-static void setup1(const struct test_case_t *);
+static int setup1(const struct test_case_t *);
#else
-static void setup1(void);
+static int setup1(void);
#endif
+static int setup2(void);
+static int setup3(void);
+static void cleanup2(void);
static void cleanup(void);
static void mlock_verify(const struct test_case_t *);
static struct test_case_t TC[] = {
- {&addr1, 1024, ENOMEM, setup1},
+ {&addr1, 1024, ENOMEM, setup1, NULL},
+ {&addr1, 1024, EPERM, setup2, cleanup2},
+ {&addr1+1024, 1024, ENOMEM, setup3, cleanup2},
};
int TST_TOTAL = ARRAY_SIZE(TC);
-static int exp_enos[] = { ENOMEM, 0 };
+static int exp_enos[] = { ENOMEM, EPERM, 0 };
int main(int ac, char **av)
{
@@ -83,6 +99,8 @@ static void setup(void)
tst_sig(NOFORK, DEF_HANDLER, cleanup);
TEST_PAUSE;
+
+ ltpuser = SAFE_GETPWNAM(cleanup, "nobody");
}
static void mlock_verify(const struct test_case_t *test)
@@ -92,6 +110,9 @@ static void mlock_verify(const struct test_case_t *test)
TEST(mlock(*(test->addr), test->len));
+ if (test->cleanupfunc != NULL)
+ test->cleanupfunc();
+
if (TEST_RETURN != -1) {
tst_resm(TFAIL, "mlock succeeded unexpectedly");
return;
@@ -107,17 +128,70 @@ static void mlock_verify(const struct test_case_t *test)
}
#ifdef __ia64__
-static void setup1(const struct test_case_t *test)
+static int setup1(const struct test_case_t *test)
{
test->len = getpagesize() + 1;
+ return 0;
}
#else
-static void setup1(void)
+static int setup1(void)
{
addr1 = NULL;
+ return 0;
}
#endif
+static int setup2(void)
+{
+ struct rlimit rl;
+
+ if (geteuid() != 0) {
+ tst_resm(TWARN, "Test needs to be run as root");
+ return -1;
+ }
+
+ rl.rlim_max = 0;
+ rl.rlim_cur = 0;
+ if (setrlimit(RLIMIT_MEMLOCK, &rl) != 0) {
+ tst_resm(TWARN,
+ "setrlimit failed to set the resource for "
+ "RLIMIT_MEMLOCK to check for mlock()");
+ return -1;
+ }
+
+ SAFE_SETEUID(cleanup, ltpuser->pw_uid);
+
+ return 0;
+}
+
+static int setup3(void)
+{
+ struct rlimit rl;
+
+ if (geteuid() != 0) {
+ tst_resm(TWARN, "Test needs to be run as root");
+ return -1;
+ }
+
+ rl.rlim_max = 1;
+ rl.rlim_cur = 1;
+ if (setrlimit(RLIMIT_MEMLOCK, &rl) != 0) {
+ tst_resm(TWARN,
+ "setrlimit failed to set the resource for "
+ "RLIMIT_MEMLOCK to check for mlock()");
+ return -1;
+ }
+
+ SAFE_SETEUID(cleanup, ltpuser->pw_uid);
+
+ return 0;
+}
+
+static void cleanup2(void)
+{
+ SAFE_SETEUID(cleanup, 0);
+}
+
static void cleanup(void)
{
TEST_CLEANUP;
--
1.8.4.2
------------------------------------------------------------------------------
Managing the Performance of Cloud-Based Applications
Take advantage of what the Cloud has to offer - Avoid Common Pitfalls.
Read the Whitepaper.
http://pubads.g.doubleclick.net/gampad/clk?id=121054471&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list