[LTP] [PATCH 2/2] setitimer03: convert to new API

Richard Palethorpe rpalethorpe@suse.de
Thu Oct 20 12:31:21 CEST 2022


Hello,

Li Wang <liwang@redhat.com> writes:

> On Thu, Oct 20, 2022 at 5:30 PM Li Wang <liwang@redhat.com> wrote:
>
>  Richard Palethorpe <rpalethorpe@suse.de> wrote:
>   
>  > -static struct itimerval *value;
>  > +static struct itimerval *value, *ovalue;
>  > +
>  > +static struct tcase {
>  > +       int which;
>  > +       struct itimerval **val;
>  > +       struct itimerval **oval;
>  > +       int exp_errno;
>
>  There is a whitespace error here (see checkpatch/make check)
>
>  yes, thanks.
>
>   
>  
>  > +} tcases[] = {
>  > +       {ITIMER_REAL,    &value, &ovalue, EFAULT},
>  > +       {ITIMER_VIRTUAL, &value, &ovalue, EFAULT},
>  > +       {-ITIMER_PROF,   &value, &ovalue, EINVAL},
>  > +};
>
>  Why do we need value and ovalue in the struct?
>
>  Becuase it does not allow parsing an invalid pointer address
>  from a structure, we have to give a valid address which pointer
>  to save an invalid address. Otherwise segement fault will
>  be hit in execution.
>
> On the other side, it also does not allow to initializer element
> is not constant in structure. So the two-level pointer is only the
> way I can make all things comprised here.

I'm not sure what you mean and I don't understand why we need this
struct at all. The following works and produces better output:

@@ -20,17 +20,6 @@

 static struct itimerval *value, *ovalue;

-static struct tcase {
-       int which;
-       struct itimerval **val;
-       struct itimerval **oval;
-       int exp_errno;
-} tcases[] = {
-       {ITIMER_REAL,    &value, &ovalue, EFAULT},
-       {ITIMER_VIRTUAL, &value, &ovalue, EFAULT},
-       {-ITIMER_PROF,   &value, &ovalue, EINVAL},
-};
-
 static int sys_setitimer(int which, void *new_value, void *old_value)
 {
 	return tst_syscall(__NR_setitimer, which, new_value, old_value);
@@ -38,13 +27,17 @@ static int sys_setitimer(int which, void *new_value, void *old_value)

 static void verify_setitimer(unsigned int i)
 {
-        struct tcase *tc = &tcases[i];
-
-	if (tc->exp_errno == EFAULT)
-		*(tc->oval) = (struct itimerval *)-1;
-
-	TST_EXP_FAIL(sys_setitimer(tc->which, *(tc->val), *(tc->oval)),
-			tc->exp_errno);
+	switch (i) {
+	case 0:
+		TST_EXP_FAIL(sys_setitimer(ITIMER_REAL, value, (void *)-1), EFAULT);
+		break;
+	case 1:
+		TST_EXP_FAIL(sys_setitimer(ITIMER_VIRTUAL, value, (void *)-1), EFAULT);
+		break;
+	case 2:
+		TST_EXP_FAIL(sys_setitimer(-ITIMER_PROF, value, ovalue), EINVAL);
+		break;
+	}
 }

 static void setup(void)
@@ -56,7 +49,7 @@ static void setup(void)
 }

 static struct tst_test test = {
-        .tcnt = ARRAY_SIZE(tcases),
+        .tcnt = 3,
 	.test = verify_setitimer,
 	.setup = setup,
 	.bufs = (struct tst_buffers[]) {

This prints

setitimer02.c:32: TPASS: sys_setitimer(ITIMER_REAL, value, (void *)-1) : EFAULT (14)
setitimer02.c:35: TPASS: sys_setitimer(ITIMER_VIRTUAL, value, (void *)-1) : EFAULT (14)
setitimer02.c:38: TPASS: sys_setitimer(-ITIMER_PROF, value, ovalue) : EINVAL (22)

instead of

setitimer02.c:46: TPASS: sys_setitimer(tc->which, *(tc->val), *(tc->oval)) : EFAULT (14)
setitimer02.c:46: TPASS: sys_setitimer(tc->which, *(tc->val), *(tc->oval)) : EFAULT (14)
setitimer02.c:46: TPASS: sys_setitimer(tc->which, *(tc->val), *(tc->oval)) : EINVAL (22)

The same values are passed to the syscall according to strace.

-- 
Thank you,
Richard.


More information about the ltp mailing list