From c48cb0cc9acae74fde12b47597f7adc9bbd15ab5 Mon Sep 17 00:00:00 2001 From: fche Date: Thu, 29 Mar 2007 20:39:55 +0000 Subject: [PATCH] 2007-03-29 Frank Ch. Eigler * tapsets.cxx (dwarf_derived_probe emit_module_init): Correct handling of kprobe registration errors in the middle of a sequence. --- ChangeLog | 5 +++++ tapsets.cxx | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 10c4cc076..463f79e0e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-03-29 Frank Ch. Eigler + + * tapsets.cxx (dwarf_derived_probe emit_module_init): Correct handling + of kprobe registration errors in the middle of a sequence. + 2007-03-29 David Smith PR 4281 diff --git a/tapsets.cxx b/tapsets.cxx index 463cbf68d..e6bc7a472 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -3805,10 +3805,15 @@ dwarf_derived_probe_group::emit_module_init (systemtap_session& s) s.op->newline() << "sdp->u.kp.pre_handler = &enter_kprobe_probe;"; s.op->newline() << "rc = register_kprobe (& sdp->u.kp);"; s.op->newline(-1) << "}"; - s.op->newline() << "if (rc) for (j=i-1; j>=0; j--) {"; // partial rollback + s.op->newline() << "if (rc) {"; + s.op->newline(1) << "for (j=i-1; j>=0; j--) {"; // partial rollback s.op->newline(1) << "struct stap_dwarf_probe *sdp2 = & stap_dwarf_probes[j];"; s.op->newline() << "if (sdp2->return_p) unregister_kretprobe (&sdp2->u.krp);"; s.op->newline() << "else unregister_kprobe (&sdp2->u.kp);"; + // NB: we don't have to clear sdp2->registered_p, since the module_exit code is + // not run for this early-abort case. + s.op->newline(-1) << "}"; + s.op->newline() << "break;"; // don't attempt to register any more probes s.op->newline(-1) << "}"; s.op->newline() << "else sdp->registered_p = 1;"; s.op->newline(-1) << "}"; // for loop -- 2.43.5