Skip to content

Commit 023154c

Browse files
bcc/tools: Introduce bpf_probe_read_user to the tools.
This is essential for architecture which do have overlapping address space. - bpf_probe_read_kernel() shall be used for reading data from kernel space to the bpf vm. - bpf_probe_read_user() shall be used for reading data from user space to the bpf vm. Signed-off-by: Sumanth Korikkar <[email protected]>
1 parent ac157b4 commit 023154c

25 files changed

+59
-40
lines changed

examples/cpp/RecordMySQLQuery.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int probe_mysql_query(struct pt_regs *ctx, void* thd, char* query, size_t len) {
3434
key.ts = bpf_ktime_get_ns();
3535
key.pid = bpf_get_current_pid_tgid();
3636
37-
bpf_probe_read_str(&key.query, sizeof(key.query), query);
37+
bpf_probe_read_user_str(&key.query, sizeof(key.query), query);
3838
3939
int one = 1;
4040
queries.update(&key, &one);

examples/lua/bashreadline.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ int printret(struct pt_regs *ctx)
1515
return 0;
1616
pid = bpf_get_current_pid_tgid();
1717
data.pid = pid;
18-
bpf_probe_read(&data.str, sizeof(data.str), (void *)PT_REGS_RC(ctx));
18+
bpf_probe_read_user(&data.str, sizeof(data.str),
19+
(void *)PT_REGS_RC(ctx));
1920
events.perf_submit(ctx, &data, sizeof(data));
2021
return 0;
2122
};

examples/lua/strlen_count.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ int printarg(struct pt_regs *ctx) {
2626
if (pid != PID)
2727
return 0;
2828
char str[128] = {};
29-
bpf_probe_read(&str, sizeof(str), (void *)PT_REGS_PARM1(ctx));
29+
bpf_probe_read_user(&str, sizeof(str), (void *)PT_REGS_PARM1(ctx));
3030
bpf_trace_printk("strlen(\"%s\")\n", &str);
3131
return 0;
3232
};

examples/lua/usdt_ruby.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ int trace_method(struct pt_regs *ctx) {
2222
bpf_usdt_readarg(2, ctx, &addr);
2323
2424
char fn_name[128] = {};
25-
bpf_probe_read(&fn_name, sizeof(fn_name), (void *)addr);
25+
bpf_probe_read_user(&fn_name, sizeof(fn_name), (void *)addr);
2626
2727
bpf_trace_printk("%s(...)\n", fn_name);
2828
return 0;

examples/tracing/mysqld_query.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
* see: https://dev.mysql.com/doc/refman/5.7/en/dba-dtrace-ref-query.html
3535
*/
3636
bpf_usdt_readarg(1, ctx, &addr);
37-
bpf_probe_read(&query, sizeof(query), (void *)addr);
37+
bpf_probe_read_user(&query, sizeof(query), (void *)addr);
3838
bpf_trace_printk("%s\\n", query);
3939
return 0;
4040
};

examples/tracing/nodejs_http_server.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
uint64_t addr;
2727
char path[128]={0};
2828
bpf_usdt_readarg(6, ctx, &addr);
29-
bpf_probe_read(&path, sizeof(path), (void *)addr);
29+
bpf_probe_read_user(&path, sizeof(path), (void *)addr);
3030
bpf_trace_printk("path:%s\\n", path);
3131
return 0;
3232
};

examples/tracing/strlen_count.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
struct key_t key = {};
3232
u64 zero = 0, *val;
3333
34-
bpf_probe_read(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx));
34+
bpf_probe_read_user(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx));
3535
// could also use `counts.increment(key)`
3636
val = counts.lookup_or_try_init(&key, &zero);
3737
if (val) {

examples/tracing/strlen_snoop.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
return 0;
3535
3636
char str[80] = {};
37-
bpf_probe_read(&str, sizeof(str), (void *)PT_REGS_PARM1(ctx));
37+
bpf_probe_read_user(&str, sizeof(str), (void *)PT_REGS_PARM1(ctx));
3838
bpf_trace_printk("%s\\n", &str);
3939
4040
return 0;

tools/bashreadline.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
return 0;
5353
pid = bpf_get_current_pid_tgid();
5454
data.pid = pid;
55-
bpf_probe_read(&data.str, sizeof(data.str), (void *)PT_REGS_RC(ctx));
55+
bpf_probe_read_user(&data.str, sizeof(data.str), (void *)PT_REGS_RC(ctx));
5656
5757
bpf_get_current_comm(&comm, sizeof(comm));
5858
if (comm[0] == 'b' && comm[1] == 'a' && comm[2] == 's' && comm[3] == 'h' && comm[4] == 0 ) {

tools/biosnoop.lua

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ int trace_req_completion(struct pt_regs *ctx, struct request *req)
8484
valp = infobyreq.lookup(&req);
8585
if (valp == 0) {
8686
data.len = req->__data_len;
87-
strcpy(data.name,"?");
87+
data.name[0] = '?';
88+
data.name[1] = 0;
8889
} else {
8990
data.pid = valp->pid;
9091
data.len = req->__data_len;

tools/biosnoop.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@
108108
valp = infobyreq.lookup(&req);
109109
if (valp == 0) {
110110
data.len = req->__data_len;
111-
strcpy(data.name, "?");
111+
data.name[0] = '?';
112+
data.name[1] = 0;
112113
} else {
113114
if (##QUEUE##) {
114115
data.qdelta = *tsp - valp->ts;

tools/dbslower.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@
127127
tmp.timestamp = bpf_ktime_get_ns();
128128
129129
#if defined(MYSQL56)
130-
bpf_probe_read(&tmp.query, sizeof(tmp.query), (void*) PT_REGS_PARM3(ctx));
130+
bpf_probe_read_user(&tmp.query, sizeof(tmp.query), (void*) PT_REGS_PARM3(ctx));
131131
#elif defined(MYSQL57)
132132
void* st = (void*) PT_REGS_PARM2(ctx);
133133
char* query;
134-
bpf_probe_read(&query, sizeof(query), st);
135-
bpf_probe_read(&tmp.query, sizeof(tmp.query), query);
134+
bpf_probe_read_user(&query, sizeof(query), st);
135+
bpf_probe_read_user(&tmp.query, sizeof(tmp.query), query);
136136
#else //USDT
137137
bpf_usdt_readarg(1, ctx, &tmp.query);
138138
#endif
@@ -157,7 +157,13 @@
157157
data.pid = pid >> 32; // only process id
158158
data.timestamp = tempp->timestamp;
159159
data.duration = delta;
160+
#if defined(MYSQL56) || defined(MYSQL57)
161+
// We already copied string to the bpf stack. Hence use bpf_probe_read()
160162
bpf_probe_read(&data.query, sizeof(data.query), tempp->query);
163+
#else
164+
// USDT - we didnt copy string to the bpf stack before.
165+
bpf_probe_read_user(&data.query, sizeof(data.query), tempp->query);
166+
#endif
161167
events.perf_submit(ctx, &data, sizeof(data));
162168
#ifdef THRESHOLD
163169
}

tools/execsnoop.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,15 @@ def parse_uid(user):
120120
121121
static int __submit_arg(struct pt_regs *ctx, void *ptr, struct data_t *data)
122122
{
123-
bpf_probe_read(data->argv, sizeof(data->argv), ptr);
123+
bpf_probe_read_user(data->argv, sizeof(data->argv), ptr);
124124
events.perf_submit(ctx, data, sizeof(struct data_t));
125125
return 1;
126126
}
127127
128128
static int submit_arg(struct pt_regs *ctx, void *ptr, struct data_t *data)
129129
{
130130
const char *argp = NULL;
131-
bpf_probe_read(&argp, sizeof(argp), ptr);
131+
bpf_probe_read_user(&argp, sizeof(argp), ptr);
132132
if (argp) {
133133
return __submit_arg(ctx, (void *)(argp), data);
134134
}

tools/funcslower.py

+10
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@
8282
u64 id;
8383
u64 start_ns;
8484
#ifdef GRAB_ARGS
85+
#ifndef __s390x__
8586
u64 args[6];
87+
#else
88+
u64 args[5];
89+
#endif
8690
#endif
8791
};
8892
@@ -94,7 +98,11 @@
9498
u64 retval;
9599
char comm[TASK_COMM_LEN];
96100
#ifdef GRAB_ARGS
101+
#ifndef __s390x__
97102
u64 args[6];
103+
#else
104+
u64 args[5];
105+
#endif
98106
#endif
99107
#ifdef USER_STACKS
100108
int user_stack_id;
@@ -130,7 +138,9 @@
130138
entry.args[2] = PT_REGS_PARM3(ctx);
131139
entry.args[3] = PT_REGS_PARM4(ctx);
132140
entry.args[4] = PT_REGS_PARM5(ctx);
141+
#ifndef __s390x__
133142
entry.args[5] = PT_REGS_PARM6(ctx);
143+
#endif
134144
#endif
135145
136146
entryinfo.update(&tgid_pid, &entry);

tools/gethostlatency.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
u32 pid = bpf_get_current_pid_tgid();
6565
6666
if (bpf_get_current_comm(&val.comm, sizeof(val.comm)) == 0) {
67-
bpf_probe_read(&val.host, sizeof(val.host),
67+
bpf_probe_read_user(&val.host, sizeof(val.host),
6868
(void *)PT_REGS_PARM1(ctx));
6969
val.pid = bpf_get_current_pid_tgid();
7070
val.ts = bpf_ktime_get_ns();

tools/lib/ucalls.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,9 @@
158158
#endif
159159
READ_CLASS
160160
READ_METHOD
161-
bpf_probe_read(&data.method.clazz, sizeof(data.method.clazz),
161+
bpf_probe_read_user(&data.method.clazz, sizeof(data.method.clazz),
162162
(void *)clazz);
163-
bpf_probe_read(&data.method.method, sizeof(data.method.method),
163+
bpf_probe_read_user(&data.method.method, sizeof(data.method.method),
164164
(void *)method);
165165
#ifndef LATENCY
166166
valp = counts.lookup_or_try_init(&data.method, &val);
@@ -182,9 +182,9 @@
182182
data.pid = bpf_get_current_pid_tgid();
183183
READ_CLASS
184184
READ_METHOD
185-
bpf_probe_read(&data.method.clazz, sizeof(data.method.clazz),
185+
bpf_probe_read_user(&data.method.clazz, sizeof(data.method.clazz),
186186
(void *)clazz);
187-
bpf_probe_read(&data.method.method, sizeof(data.method.method),
187+
bpf_probe_read_user(&data.method.method, sizeof(data.method.method),
188188
(void *)method);
189189
entry_timestamp = entry.lookup(&data);
190190
if (!entry_timestamp) {

tools/lib/uflow.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@
8181
8282
READ_CLASS
8383
READ_METHOD
84-
bpf_probe_read(&data.clazz, sizeof(data.clazz), (void *)clazz);
85-
bpf_probe_read(&data.method, sizeof(data.method), (void *)method);
84+
bpf_probe_read_user(&data.clazz, sizeof(data.clazz), (void *)clazz);
85+
bpf_probe_read_user(&data.method, sizeof(data.method), (void *)method);
8686
8787
FILTER_CLASS
8888
FILTER_METHOD

tools/lib/ugc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ def format(self, data):
140140
u64 manager = 0, pool = 0;
141141
bpf_usdt_readarg(1, ctx, &manager); // ptr to manager name
142142
bpf_usdt_readarg(3, ctx, &pool); // ptr to pool name
143-
bpf_probe_read(&event.string1, sizeof(event.string1), (void *)manager);
144-
bpf_probe_read(&event.string2, sizeof(event.string2), (void *)pool);
143+
bpf_probe_read_user(&event.string1, sizeof(event.string1), (void *)manager);
144+
bpf_probe_read_user(&event.string2, sizeof(event.string2), (void *)pool);
145145
"""
146146

147147
def formatter(e):

tools/lib/uobjnew.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
u64 classptr = 0, size = 0;
9999
bpf_usdt_readarg(2, ctx, &classptr);
100100
bpf_usdt_readarg(4, ctx, &size);
101-
bpf_probe_read(&key.name, sizeof(key.name), (void *)classptr);
101+
bpf_probe_read_user(&key.name, sizeof(key.name), (void *)classptr);
102102
valp = allocs.lookup_or_try_init(&key, &zero);
103103
if (valp) {
104104
valp->total_size += size;
@@ -132,7 +132,7 @@
132132
struct val_t *valp, zero = {};
133133
u64 classptr = 0;
134134
bpf_usdt_readarg(1, ctx, &classptr);
135-
bpf_probe_read(&key.name, sizeof(key.name), (void *)classptr);
135+
bpf_probe_read_user(&key.name, sizeof(key.name), (void *)classptr);
136136
valp = allocs.lookup_or_try_init(&key, &zero);
137137
if (valp) {
138138
valp->num_allocs += 1; // We don't know the size, unfortunately

tools/lib/uthreads.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
bpf_usdt_readarg(1, ctx, &nameptr);
8181
bpf_usdt_readarg(3, ctx, &id);
8282
bpf_usdt_readarg(4, ctx, &native_id);
83-
bpf_probe_read(&te.name, sizeof(te.name), (void *)nameptr);
83+
bpf_probe_read_user(&te.name, sizeof(te.name), (void *)nameptr);
8484
te.runtime_id = id;
8585
te.native_id = native_id;
8686
__builtin_memcpy(&te.type, type, sizeof(te.type));

tools/mountsnoop.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -109,22 +109,22 @@
109109
110110
event.type = EVENT_MOUNT_SOURCE;
111111
__builtin_memset(event.str, 0, sizeof(event.str));
112-
bpf_probe_read(event.str, sizeof(event.str), source);
112+
bpf_probe_read_user(event.str, sizeof(event.str), source);
113113
events.perf_submit(ctx, &event, sizeof(event));
114114
115115
event.type = EVENT_MOUNT_TARGET;
116116
__builtin_memset(event.str, 0, sizeof(event.str));
117-
bpf_probe_read(event.str, sizeof(event.str), target);
117+
bpf_probe_read_user(event.str, sizeof(event.str), target);
118118
events.perf_submit(ctx, &event, sizeof(event));
119119
120120
event.type = EVENT_MOUNT_TYPE;
121121
__builtin_memset(event.str, 0, sizeof(event.str));
122-
bpf_probe_read(event.str, sizeof(event.str), type);
122+
bpf_probe_read_user(event.str, sizeof(event.str), type);
123123
events.perf_submit(ctx, &event, sizeof(event));
124124
125125
event.type = EVENT_MOUNT_DATA;
126126
__builtin_memset(event.str, 0, sizeof(event.str));
127-
bpf_probe_read(event.str, sizeof(event.str), data);
127+
bpf_probe_read_user(event.str, sizeof(event.str), data);
128128
events.perf_submit(ctx, &event, sizeof(event));
129129
130130
return 0;
@@ -164,7 +164,7 @@
164164
165165
event.type = EVENT_UMOUNT_TARGET;
166166
__builtin_memset(event.str, 0, sizeof(event.str));
167-
bpf_probe_read(event.str, sizeof(event.str), target);
167+
bpf_probe_read_user(event.str, sizeof(event.str), target);
168168
events.perf_submit(ctx, &event, sizeof(event));
169169
170170
return 0;

tools/mysqld_qslower.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def usage():
8181
if (delta >= """ + str(min_ns) + """) {
8282
// populate and emit data struct
8383
struct data_t data = {.pid = pid, .ts = sp->ts, .delta = delta};
84-
bpf_probe_read(&data.query, sizeof(data.query), (void *)sp->query);
84+
bpf_probe_read_user(&data.query, sizeof(data.query), (void *)sp->query);
8585
events.perf_submit(ctx, &data, sizeof(data));
8686
}
8787

tools/opensnoop.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@
152152
return 0;
153153
}
154154
bpf_probe_read(&data.comm, sizeof(data.comm), valp->comm);
155-
bpf_probe_read(&data.fname, sizeof(data.fname), (void *)valp->fname);
155+
bpf_probe_read_user(&data.fname, sizeof(data.fname), (void *)valp->fname);
156156
data.id = valp->id;
157157
data.ts = tsp / 1000;
158158
data.uid = bpf_get_current_uid_gid();
@@ -167,7 +167,7 @@
167167
"""
168168

169169
bpf_text_kfunc= """
170-
KRETFUNC_PROBE(do_sys_open, int dfd, const char *filename, int flags, int mode, int ret)
170+
KRETFUNC_PROBE(do_sys_open, int dfd, const char __user *filename, int flags, int mode, int ret)
171171
{
172172
u64 id = bpf_get_current_pid_tgid();
173173
u32 pid = id >> 32; // PID is higher part
@@ -189,7 +189,7 @@
189189
190190
u64 tsp = bpf_ktime_get_ns();
191191
192-
bpf_probe_read(&data.fname, sizeof(data.fname), (void *)filename);
192+
bpf_probe_read_user(&data.fname, sizeof(data.fname), (void *)filename);
193193
data.id = id;
194194
data.ts = tsp / 1000;
195195
data.uid = bpf_get_current_uid_gid();

tools/sslsniff.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
bpf_get_current_comm(&__data.comm, sizeof(__data.comm));
7373
7474
if ( buf != 0) {
75-
bpf_probe_read(&__data.v0, sizeof(__data.v0), buf);
75+
bpf_probe_read_user(&__data.v0, sizeof(__data.v0), buf);
7676
}
7777
7878
perf_SSL_write.perf_submit(ctx, &__data, sizeof(__data));
@@ -108,7 +108,7 @@
108108
bpf_get_current_comm(&__data.comm, sizeof(__data.comm));
109109
110110
if (bufp != 0) {
111-
bpf_probe_read(&__data.v0, sizeof(__data.v0), (char *)*bufp);
111+
bpf_probe_read_user(&__data.v0, sizeof(__data.v0), (char *)*bufp);
112112
}
113113
114114
bufs.delete(&pid);

tools/statsnoop.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
}
8585
8686
struct data_t data = {.pid = pid};
87-
bpf_probe_read(&data.fname, sizeof(data.fname), (void *)valp->fname);
87+
bpf_probe_read_user(&data.fname, sizeof(data.fname), (void *)valp->fname);
8888
bpf_get_current_comm(&data.comm, sizeof(data.comm));
8989
data.ts_ns = bpf_ktime_get_ns();
9090
data.ret = PT_REGS_RC(ctx);

0 commit comments

Comments
 (0)