diff options
author | Keith M Wesolowski <wesolows@foobazco.org> | 2014-11-03 15:56:48 +0000 |
---|---|---|
committer | Keith M Wesolowski <wesolows@foobazco.org> | 2014-11-03 15:56:48 +0000 |
commit | 79a55942209fa274df93f09eb61f46c4c04c0a7c (patch) | |
tree | 80c4ed61cf562f6da09271fdc5182a6a30a6dc46 /usr/src/cmd/mdb/intel | |
parent | 6e0e3ceffbc20a30b37f808b284782085f23f933 (diff) | |
parent | 0b4538017e5f84a04187012fe88bb3e46f1c5f51 (diff) | |
download | illumos-joyent-79a55942209fa274df93f09eb61f46c4c04c0a7c.tar.gz |
[illumos-gate merge]
commit 0b4538017e5f84a04187012fe88bb3e46f1c5f51
5132 mdb loops forever printing a stack backtrace
commit 2f3e88a2ae884dfc1a740509fcb6f469cc3b115c
4989 removal of ntfsprogs and parted (missed files)
Conflicts:
usr/src/cmd/mdb/common/mdb/mdb_errno.h
usr/src/cmd/mdb/common/mdb/mdb_err.c
Diffstat (limited to 'usr/src/cmd/mdb/intel')
-rw-r--r-- | usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c | 30 | ||||
-rw-r--r-- | usr/src/cmd/mdb/intel/mdb/mdb_ia32util.c | 27 |
2 files changed, 44 insertions, 13 deletions
diff --git a/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c b/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c index 432f22210c..b56a7388e3 100644 --- a/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c +++ b/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c @@ -24,8 +24,8 @@ * Use is subject to license terms. */ /* - * Copyright 2013 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #include <sys/types.h> @@ -220,6 +220,7 @@ mdb_amd64_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, uint_t argc, reg_argc; long fr_argv[32]; int start_index; /* index to save_instr where to start comparison */ + int err; int i; struct { @@ -229,7 +230,7 @@ mdb_amd64_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, uintptr_t fp = gsp->kregs[KREG_RBP]; uintptr_t pc = gsp->kregs[KREG_RIP]; - uintptr_t lastfp; + uintptr_t lastfp = 0; ssize_t size; ssize_t insnsize; @@ -251,11 +252,22 @@ mdb_amd64_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, while (fp != 0) { int args_style = 0; - if (!fp_is_aligned(fp, xpv_panic)) - return (set_errno(EMDB_STKALIGN)); - - if (mdb_tgt_vread(t, &fr, sizeof (fr), fp) != sizeof (fr)) - return (-1); /* errno has been set for us */ + /* + * Ensure progress (increasing fp), and prevent + * endless loop with the same FP. + */ + if (fp <= lastfp) { + err = EMDB_STKFRAME; + goto badfp; + } + if (!fp_is_aligned(fp, xpv_panic)) { + err = EMDB_STKALIGN; + goto badfp; + } + if (mdb_tgt_vread(t, &fr, sizeof (fr), fp) != sizeof (fr)) { + err = EMDB_NOMAP; + goto badfp; + } if ((mdb_tgt_lookup_by_addr(t, pc, MDB_TGT_SYM_FUZZY, NULL, 0, &s, &sip) == 0) && @@ -384,6 +396,10 @@ mdb_amd64_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, } return (0); + +badfp: + mdb_printf("%p [%s]", fp, mdb_strerror(err)); + return (set_errno(err)); } /* diff --git a/usr/src/cmd/mdb/intel/mdb/mdb_ia32util.c b/usr/src/cmd/mdb/intel/mdb/mdb_ia32util.c index 43db94741b..80ce1c7ad2 100644 --- a/usr/src/cmd/mdb/intel/mdb/mdb_ia32util.c +++ b/usr/src/cmd/mdb/intel/mdb/mdb_ia32util.c @@ -24,6 +24,7 @@ */ /* * Copyright (c) 2012, Joyent, Inc. All rights reserved. + * Copyright 2014 Nexenta Systems, Inc. All rights reserved. */ #include <sys/types.h> @@ -194,6 +195,7 @@ mdb_ia32_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, mdb_tgt_gregset_t gregs; kreg_t *kregs = &gregs.kregs[0]; int got_pc = (gsp->kregs[KREG_EIP] != 0); + int err; struct { uintptr_t fr_savfp; @@ -203,7 +205,7 @@ mdb_ia32_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, uintptr_t fp = gsp->kregs[KREG_EBP]; uintptr_t pc = gsp->kregs[KREG_EIP]; - uintptr_t lastfp; + uintptr_t lastfp = 0; ssize_t size; uint_t argc; @@ -219,16 +221,25 @@ mdb_ia32_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, while (fp != 0) { - if (fp & (STACK_ALIGN - 1)) - return (set_errno(EMDB_STKALIGN)); - + /* + * Ensure progress (increasing fp), and prevent + * endless loop with the same FP. + */ + if (fp <= lastfp) { + err = EMDB_STKFRAME; + goto badfp; + } + if (fp & (STACK_ALIGN - 1)) { + err = EMDB_STKALIGN; + goto badfp; + } if ((size = mdb_tgt_vread(t, &fr, sizeof (fr), fp)) >= (ssize_t)(2 * sizeof (uintptr_t))) { size -= (ssize_t)(2 * sizeof (uintptr_t)); argc = kvm_argcount(t, fr.fr_savpc, size); } else { - bzero(&fr, sizeof (fr)); - argc = 0; + err = EMDB_NOMAP; + goto badfp; } if (got_pc && func(arg, pc, argc, fr.fr_argv, &gregs) != 0) @@ -257,6 +268,10 @@ mdb_ia32_kvm_stack_iter(mdb_tgt_t *t, const mdb_tgt_gregset_t *gsp, } return (0); + +badfp: + mdb_printf("%p [%s]", fp, mdb_strerror(err)); + return (set_errno(err)); } /* |