diff options
author | Josh Stone <jistone@redhat.com> | 2009-06-10 15:50:04 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-06-10 15:50:04 -0700 |
commit | cc76db234897ff09eda098e786643506517b2175 (patch) | |
tree | d98a47afce507df1ec0966b667f0a7f672330e8d | |
parent | 67146982d334acdb25f43da2a74c02fcabc3c45d (diff) | |
download | systemtap-steved-cc76db234897ff09eda098e786643506517b2175.tar.gz systemtap-steved-cc76db234897ff09eda098e786643506517b2175.tar.xz systemtap-steved-cc76db234897ff09eda098e786643506517b2175.zip |
PR10260: Clean up all resources after init errors
When anything in systemtap_module_init fails, and we return non-zero,
then the module load is aborted. The normal module unload path
(systemtap_module_exit) is not even attempted, so we need to make sure
that all partially-allocated resources are returned.
Our timer callbacks for the gettimeofday subsystem are a classic example
of this error. If we don't unregister the timers before aborting init,
they will later be called and cause a kernel fault.
We also were neglecting to free the percpu context. A memory leak is
less harmful, but that's fixed now too.
-rw-r--r-- | translate.cxx | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/translate.cxx b/translate.cxx index 4e312f3e..518e5584 100644 --- a/translate.cxx +++ b/translate.cxx @@ -1249,6 +1249,14 @@ c_unparser::emit_module_init () o->newline() << "synchronize_sched();"; o->newline() << "#endif"; + // In case gettimeofday was started, it needs to be stopped + o->newline() << "#ifdef STAP_NEED_GETTIMEOFDAY"; + o->newline() << " _stp_kill_time();"; // An error is no cause to hurry... + o->newline() << "#endif"; + + // Free up the context memory after an error too + o->newline() << "free_percpu (contexts);"; + o->newline() << "return rc;"; o->newline(-1) << "}\n"; } |