Add EPERM and ENOMEM errno tests for mlock(2).

Signed-off-by: Zeng Linggang <[email protected]>
---
 testcases/kernel/syscalls/mlock/mlock02.c | 65 +++++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 3 deletions(-)

diff --git a/testcases/kernel/syscalls/mlock/mlock02.c 
b/testcases/kernel/syscalls/mlock/mlock02.c
index 811d141..79f1d29 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,21 +45,29 @@ struct test_case_t {
        void **addr;
        int len;
        int error;
-       void (*setupfunc) (struct test_case_t *);
+       void (*setupfunc) ();
+       void (*cleanupfunc) (void);
 };
 
 static void *addr1;
+static char addr2[1024];
+static struct passwd *ltpuser;
 static void setup(void);
 static void setup1(struct test_case_t *);
+static void setup2(void);
+static void setup3(void);
+static void cleanup2(void);
 static void cleanup(void);
 static void mlock_verify(struct test_case_t *);
 
 static struct test_case_t TC[] = {
-       {&addr1, 1024, ENOMEM, setup1},
+       {&addr1, 1024, ENOMEM, setup1, NULL},
+       {(void **)&addr2, 1024, EPERM, setup2, cleanup2},
+       {(void **)&addr2, 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)
 {
@@ -76,9 +93,13 @@ int main(int ac, char **av)
 
 static void setup(void)
 {
+       tst_require_root(NULL);
+
        tst_sig(NOFORK, DEF_HANDLER, cleanup);
 
        TEST_PAUSE;
+
+       ltpuser = SAFE_GETPWNAM(cleanup, "nobody");
 }
 
 static void mlock_verify(struct test_case_t *test)
@@ -88,6 +109,9 @@ static void mlock_verify(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;
@@ -111,6 +135,41 @@ static void setup1(struct test_case_t *test)
 #endif
 }
 
+static void setup2(void)
+{
+       struct rlimit rl;
+
+       rl.rlim_max = 0;
+       rl.rlim_cur = 0;
+       if (setrlimit(RLIMIT_MEMLOCK, &rl) != 0) {
+               tst_brkm(TBROK, cleanup,
+                        "setrlimit failed to set the resource for "
+                        "RLIMIT_MEMLOCK to check for mlock()");
+       }
+
+       SAFE_SETEUID(cleanup, ltpuser->pw_uid);
+}
+
+static void setup3(void)
+{
+       struct rlimit rl;
+
+       rl.rlim_max = 1;
+       rl.rlim_cur = 1;
+       if (setrlimit(RLIMIT_MEMLOCK, &rl) != 0) {
+               tst_brkm(TBROK, cleanup,
+                        "setrlimit failed to set the resource for "
+                        "RLIMIT_MEMLOCK to check for mlock()");
+       }
+
+       SAFE_SETEUID(cleanup, ltpuser->pw_uid);
+}
+
+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

Reply via email to