[PATCH] tests/ipc_sem: don't match address of sem buffer

Andreas Schwab schwab at suse.de
Mon Mar 16 14:10:56 UTC 2015


"Dmitry V. Levin" <ldv-u2l5PoMzF/Vg9hUCZPvPmw at public.gmane.org> writes:

> On Thu, Mar 12, 2015 at 11:13:49AM +0100, Andreas Schwab wrote:
>> "Dmitry V. Levin" <ldv-u2l5PoMzF/Vg9hUCZPvPmw-XMD5yJDbdMReXY1tMh2IBg at public.gmane.org> writes:
>> > On Wed, Mar 11, 2015 at 01:07:15PM +0100, Andreas Schwab wrote:
>> >> On architectures where the semctl call is implemented by the ipc syscall
>> >> the glibc wrapper passes a pointer to a local variable, so the value of
>> >> the fourth argument is unknown.
>> >
>> > Wouldn't it be better to fix the parser, e.g.
>> >
>> > --- a/ipc.c
>> > +++ b/ipc.c
>> > @@ -281,7 +281,16 @@ int sys_semctl(struct tcb *tcp)
>> >  	if (entering(tcp)) {
>> >  		tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
>> >  		PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
>> > -		tprintf(", %#lx", tcp->u_arg[3]);
>> > +		tprints(", ");
>> > +		if (indirect_ipccall(tcp)) {
>> > +			if (current_wordsize == sizeof(int)) {
>> > +				printnum_int(tcp, tcp->u_arg[3], "%#x");
>> > +			} else {
>> > +				printnum_long(tcp, tcp->u_arg[3], "%#lx");
>> > +			}
>> 
>> That prints [...] instead of just the number, though.
>
> Yes, of course it does.

This patch is needed on top.

diff --git a/tests/ipc_sem.c b/tests/ipc_sem.c
index d92ec60..345fc8a 100644
--- a/tests/ipc_sem.c
+++ b/tests/ipc_sem.c
@@ -26,13 +26,13 @@ main(void)
 	un.buf = &ds;
 	if (semctl(id, 0, IPC_STAT, un))
 		goto fail;
-	printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, %p\\) += 0\n", id, &ds);
+	printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_STAT, \\[?%p\\]?\\) += 0\n", id, &ds);
 
 	un.__buf = &info;
 	int max = semctl(0, 0, SEM_INFO, un);
 	if (max < 0)
 		goto fail;
-	printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, %p\\) += %d\n", &info, max);
+	printf("semctl\\(0, 0, (IPC_64\\|)?SEM_INFO, \\[?%p\\]?\\) += %d\n", &info, max);
 
 	un.buf = &ds;
 	rc = semctl(id, 0, SEM_STAT, un);
@@ -43,16 +43,16 @@ main(void)
 		 */
 		if (-1 != rc || EINVAL != errno)
 			goto fail;
-		printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, %p\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds);
+		printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += -1 EINVAL \\(Invalid argument\\)\n", id, &ds);
 	} else {
-		printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, %p\\) += %d\n", id, &ds, id);
+		printf("semctl\\(%d, 0, (IPC_64\\|)?SEM_STAT, \\[?%p\\]?\\) += %d\n", id, &ds, id);
 	}
 
 	rc = 0;
 done:
 	if (semctl(id, 0, IPC_RMID, 0) < 0)
 		return 1;
-	printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
+	printf("semctl\\(%d, 0, (IPC_64\\|)?IPC_RMID, \\[?0\\]?\\) += 0\n", id);
 	return rc;
 
 fail:


Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab at suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."




More information about the Strace-devel mailing list