diff options
author | dsmith <dsmith> | 2007-08-14 15:27:58 +0000 |
---|---|---|
committer | dsmith <dsmith> | 2007-08-14 15:27:58 +0000 |
commit | b79aff3684e02d6f83a2fa2a2fcfe53d5c9d6d14 (patch) | |
tree | bb872eed2c44fbca889e0a068ecd964e86938f87 /runtime/transport/relayfs.c | |
parent | 5eddf13b73a01f3b334e5be80fc3cc1b312d1fea (diff) | |
download | systemtap-steved-b79aff3684e02d6f83a2fa2a2fcfe53d5c9d6d14.tar.gz systemtap-steved-b79aff3684e02d6f83a2fa2a2fcfe53d5c9d6d14.tar.xz systemtap-steved-b79aff3684e02d6f83a2fa2a2fcfe53d5c9d6d14.zip |
2007-08-14 David Smith <dsmith@redhat.com>
Merge from setuid-branch. Changes also by Martin Hunt
<hunt@redhat.com>.
* control.c (_stp_ctl_write): Make sure we don't overflow.
(_stp_ctl_open_cmd): Do not allow multiple opens of the control
file.
(_stp_ctl_write_cmd): Once STP_START is received, ignore
everything except STP_EXIT. Create another state variable
"initialized". Don't respond to STP_SYMBOLS or STP_MODULES unless
initialized is 0. Also check that current pid is the same as the
pid that did insmod.
(_stp_register_ctl_channel): Bug fix - sets owner/group after
checking for NULL.
* procfs.c (_stp_ctl_write): Make sure we don't overflow.
(_stp_ctl_open_cmd): Do not allow multiple opens of the control
file.
(_stp_ctl_write_cmd): Once STP_START is received, ignore
everything except STP_EXIT. Create another state variable
"initialized". Don't respond to STP_SYMBOLS or STP_MODULES unless
initialized is 0. Also check that current pid is the same as the
pid that did insmod.
(_stp_register_ctl_channel): Set ownership of cmd file and percpu
files for bulkmode.
* relayfs.c (utt_trace_setup): Set ownership of percpu files.
Improved error handling.
(utt_trace_remove): Improved error checking.
* utt.c (utt_remove_tree): Improved error checking.
(utt_trace_cleanup): Ditto.
(utt_create_buf_file_callback): Set file ownership.
(utt_create_global_buf_file_callback): Set file ownership.
* transport.h: Delcare _stp_uid, _stp_gid, and _stp_init_pid.
* transport.c (_stp_transport_init): Set _stp_uid, _stp_gid, and
_stp_init_pid.
Diffstat (limited to 'runtime/transport/relayfs.c')
-rw-r--r-- | runtime/transport/relayfs.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/runtime/transport/relayfs.c b/runtime/transport/relayfs.c index 2615145c..28bb0e65 100644 --- a/runtime/transport/relayfs.c +++ b/runtime/transport/relayfs.c @@ -80,14 +80,15 @@ static void _stp_remove_relay_root(struct dentry *root) struct utt_trace *utt_trace_setup(struct utt_trace_setup *utts) { struct utt_trace *utt; + int i; utt = _stp_kzalloc(sizeof(*utt)); if (!utt) return NULL; - utt->utt_tree_root = _stp_get_root_dir(utts->root); + utt->utt_tree_root = _stp_get_root_dir(utts->root); if (!utt->utt_tree_root) - return NULL; + goto err; utt->dir = relayfs_create_dir(utts->name, utt->utt_tree_root); if (!utt->dir) @@ -95,20 +96,29 @@ struct utt_trace *utt_trace_setup(struct utt_trace_setup *utts) kbug("relay_open %d %d\n", utts->buf_size, utts->buf_nr); - utt->rchan = relay_open("trace", utt->dir, utts->buf_size, utts->buf_nr, 0, &stp_rchan_callbacks); + utt->rchan = relay_open("trace", utt->dir, utts->buf_size, + utts->buf_nr, 0, &stp_rchan_callbacks); if (!utt->rchan) - goto err1; + goto err; + + /* now set ownership */ + for_each_online_cpu(i) { + utt->rchan->buf[i]->dentry->d_inode->i_uid = _stp_uid; + utt->rchan->buf[i]->dentry->d_inode->i_gid = _stp_gid; + } utt->rchan->private_data = utt; utt->trace_state = Utt_trace_setup; utts->err = 0; return utt; -err1: - errk("couldn't create relay channel.\n"); - _stp_remove_relay_dir(utt->dir); err: - _stp_remove_relay_root(utt->utt_tree_root); + errk("couldn't create relay channel.\n"); + if (utt->dir) + _stp_remove_relay_dir(utt->dir); + if (utt->utt_tree_root) + _stp_remove_relay_root(utt->utt_tree_root); + kfree(utt); return NULL; } @@ -151,9 +161,12 @@ int utt_trace_remove(struct utt_trace *utt) { kbug("removing relayfs files. %d\n", utt->trace_state); if (utt && (utt->trace_state == Utt_trace_setup || utt->trace_state == Utt_trace_stopped)) { - relay_close(utt->rchan); - _stp_remove_relay_dir(utt->dir); - _stp_remove_relay_root(utt->utt_tree_root); + if (utt->rchan) + relay_close(utt->rchan); + if (utt->dir) + _stp_remove_relay_dir(utt->dir); + if (utt->utt_tree_root) + _stp_remove_relay_root(utt->utt_tree_root); kfree(utt); } return 0; |