=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/kdump/kdump.c,v retrieving revision 1.102 retrieving revision 1.103 diff -c -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 **** ! /* $OpenBSD: kdump.c,v 1.102 2015/07/19 02:52:35 deraadt Exp $ */ /*- * Copyright (c) 1988, 1993 --- 1,4 ---- ! /* $OpenBSD: kdump.c,v 1.103 2015/07/19 04:45:25 guenther Exp $ */ /*- * Copyright (c) 1988, 1993 *************** *** 146,152 **** 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 ktruser(struct ktr_user *, size_t); static void setemul(const char *); static void usage(void); --- 146,152 ---- 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 *, size_t); static void ktruser(struct ktr_user *, size_t); static void setemul(const char *); static void usage(void); *************** *** 281,287 **** ktrsyscall((struct ktr_syscall *)m, ktrlen); break; case KTR_SYSRET: ! ktrsysret((struct ktr_sysret *)m); break; case KTR_NAMEI: ktrnamei(m, ktrlen); --- 281,287 ---- ktrsyscall((struct ktr_syscall *)m, ktrlen); break; case KTR_SYSRET: ! ktrsysret((struct ktr_sysret *)m, ktrlen); break; case KTR_NAMEI: ktrnamei(m, ktrlen); *************** *** 1105,1121 **** } static void ! ktrsysret(struct ktr_sysret *ktr) { ! register_t ret = ktr->ktr_retval; int error = ktr->ktr_error; int code = ktr->ktr_code; 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 || strcmp(current->sysnames[code], "vfork") == 0 || strcmp(current->sysnames[code], "__tfork") == 0 || strcmp(current->sysnames[code], "clone") == 0)) --- 1105,1137 ---- } static void ! ktrsysret(struct ktr_sysret *ktr, size_t ktrlen) { ! 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 (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,1130 **** --- 1141,1151 ---- 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,1156 **** } } else { if (decimal) ! (void)printf("%ld", (long)ret); else ! (void)printf("%#lx", (long)ret); } } else if (error == ERESTART) (void)printf("RESTART"); --- 1169,1177 ---- } } else { if (decimal) ! (void)printf("%lld", retll); else ! (void)printf("%#llx", retll); } } else if (error == ERESTART) (void)printf("RESTART");