Consistently handle unsigned arguments of mmap* and remap_file_pages

Explicitly declare first 4 arguments of mmap* and all remap_file_pages
arguments as unsigned to avoid potential sign extension issues.

* mem.c (print_mmap, SYS_FUNC(remap_file_pages)): Assign syscall
arguments to local variables of appropriate types.
This commit is contained in:
Дмитрий Левин 2016-04-01 15:31:23 +00:00
parent f40ea796ba
commit 3ae8690d8e

46
mem.c
View File

@ -57,24 +57,24 @@ SYS_FUNC(brk)
static void static void
print_mmap(struct tcb *tcp, long *u_arg, unsigned long long offset) print_mmap(struct tcb *tcp, long *u_arg, unsigned long long offset)
{ {
/* addr */ const unsigned long addr = u_arg[0];
printaddr(u_arg[0]); const unsigned long len = u_arg[1];
/* len */ const unsigned long prot = u_arg[2];
tprintf(", %lu, ", u_arg[1]); const unsigned long flags = u_arg[3];
/* prot */ const int fd = u_arg[4];
printflags(mmap_prot, u_arg[2], "PROT_???");
printaddr(addr);
tprintf(", %lu, ", len);
printflags(mmap_prot, prot, "PROT_???");
tprints(", "); tprints(", ");
/* flags */
#ifdef MAP_TYPE #ifdef MAP_TYPE
printxval(mmap_flags, u_arg[3] & MAP_TYPE, "MAP_???"); printxval(mmap_flags, flags & MAP_TYPE, "MAP_???");
addflags(mmap_flags, u_arg[3] & ~MAP_TYPE); addflags(mmap_flags, flags & ~MAP_TYPE);
#else #else
printflags(mmap_flags, u_arg[3], "MAP_???"); printflags(mmap_flags, flags, "MAP_???");
#endif #endif
tprints(", "); tprints(", ");
/* fd */ printfd(tcp, fd);
printfd(tcp, u_arg[4]);
/* offset */
tprintf(", %#llx", offset); tprintf(", %#llx", offset);
} }
@ -301,15 +301,21 @@ SYS_FUNC(getpagesize)
SYS_FUNC(remap_file_pages) SYS_FUNC(remap_file_pages)
{ {
printaddr(tcp->u_arg[0]); const unsigned long addr = tcp->u_arg[0];
tprintf(", %lu, ", tcp->u_arg[1]); const unsigned long size = tcp->u_arg[1];
printflags(mmap_prot, tcp->u_arg[2], "PROT_???"); const unsigned long prot = tcp->u_arg[2];
tprintf(", %lu, ", tcp->u_arg[3]); const unsigned long pgoff = tcp->u_arg[3];
const unsigned long flags = tcp->u_arg[4];
printaddr(addr);
tprintf(", %lu, ", size);
printflags(mmap_prot, prot, "PROT_???");
tprintf(", %lu, ", pgoff);
#ifdef MAP_TYPE #ifdef MAP_TYPE
printxval(mmap_flags, tcp->u_arg[4] & MAP_TYPE, "MAP_???"); printxval(mmap_flags, flags & MAP_TYPE, "MAP_???");
addflags(mmap_flags, tcp->u_arg[4] & ~MAP_TYPE); addflags(mmap_flags, flags & ~MAP_TYPE);
#else #else
printflags(mmap_flags, tcp->u_arg[4], "MAP_???"); printflags(mmap_flags, flags, "MAP_???");
#endif #endif
return RVAL_DECODED; return RVAL_DECODED;