summaryrefslogtreecommitdiffstats
path: root/runtime/transport/relayfs.c
diff options
context:
space:
mode:
authordsmith <dsmith>2007-08-14 15:27:58 +0000
committerdsmith <dsmith>2007-08-14 15:27:58 +0000
commitb79aff3684e02d6f83a2fa2a2fcfe53d5c9d6d14 (patch)
treebb872eed2c44fbca889e0a068ecd964e86938f87 /runtime/transport/relayfs.c
parent5eddf13b73a01f3b334e5be80fc3cc1b312d1fea (diff)
downloadsystemtap-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.c35
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;