=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/kdump/kdump.c,v retrieving revision 1.102 retrieving revision 1.103 diff -u -r1.102 -r1.103 --- src/usr.bin/kdump/kdump.c 2015/07/19 02:52:35 1.102 +++ src/usr.bin/kdump/kdump.c 2015/07/19 04:45:25 1.103 @@ -1,4 +1,4 @@ -/* $OpenBSD: kdump.c,v 1.102 2015/07/19 02:52:35 deraadt Exp $ */ +/* $OpenBSD: kdump.c,v 1.103 2015/07/19 04:45:25 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -146,7 +146,7 @@ static void ktrpsig(struct ktr_psig *); static void ktrsyscall(struct ktr_syscall *, size_t); static const char *kresolvsysctl(int, const int *); -static void ktrsysret(struct ktr_sysret *); +static void ktrsysret(struct ktr_sysret *, size_t); static void ktruser(struct ktr_user *, size_t); static void setemul(const char *); static void usage(void); @@ -281,7 +281,7 @@ ktrsyscall((struct ktr_syscall *)m, ktrlen); break; case KTR_SYSRET: - ktrsysret((struct ktr_sysret *)m); + ktrsysret((struct ktr_sysret *)m, ktrlen); break; case KTR_NAMEI: ktrnamei(m, ktrlen); @@ -1105,17 +1105,33 @@ } static void -ktrsysret(struct ktr_sysret *ktr) +ktrsysret(struct ktr_sysret *ktr, size_t ktrlen) { - register_t ret = ktr->ktr_retval; + register_t ret = 0; + long long retll; int error = ktr->ktr_error; int code = ktr->ktr_code; + if (ktrlen < sizeof(*ktr)) + errx(1, "sysret length %zu < ktr header length %zu", + ktrlen, sizeof(*ktr)); + ktrlen -= sizeof(*ktr); + if (error == 0) { + if (ktrlen == sizeof(ret)) { + memcpy(&ret, ktr+1, sizeof(ret)); + retll = ret; + } else if (ktrlen == sizeof(retll)) + memcpy(&retll, ktr+1, sizeof(retll)); + else + errx(1, "sysret bogus length %zu", ktrlen); + } + if (code >= current->nsysnames || code < 0) (void)printf("[%d] ", code); else { (void)printf("%s ", current->sysnames[code]); - if (ret > 0 && (strcmp(current->sysnames[code], "fork") == 0 || + if (error == 0 && ret > 0 && + (strcmp(current->sysnames[code], "fork") == 0 || strcmp(current->sysnames[code], "vfork") == 0 || strcmp(current->sysnames[code], "__tfork") == 0 || strcmp(current->sysnames[code], "clone") == 0)) @@ -1125,6 +1141,11 @@ if (error == 0) { if (fancy) { switch (current == &emulations[0] ? code : -1) { + case SYS_lseek: + (void)printf("%lld", retll); + if (retll < 0 || retll > 9) + (void)printf("/%#llx", retll); + break; case SYS_sigprocmask: case SYS_sigpending: sigset(ret); @@ -1148,9 +1169,9 @@ } } else { if (decimal) - (void)printf("%ld", (long)ret); + (void)printf("%lld", retll); else - (void)printf("%#lx", (long)ret); + (void)printf("%#llx", retll); } } else if (error == ERESTART) (void)printf("RESTART");