From: Greg Kroah-Hartman Date: Fri, 1 Dec 2023 08:22:26 +0000 (+0000) Subject: drop tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch... X-Git-Tag: v5.15.141~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d82b1f400858141e183599d25a1f07fe85a18dde;p=thirdparty%2Fkernel%2Fstable-queue.git drop tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch from everywhere --- diff --git a/queue-4.14/series b/queue-4.14/series index a5ebb8aa86a..3c5c2317c1f 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -8,7 +8,6 @@ arm-xen-fix-xen_vcpu_info-allocation-alignment.patch amd-xgbe-handle-corner-case-during-sfp-hotplug.patch amd-xgbe-propagate-the-correct-speed-and-duplex-stat.patch net-axienet-fix-check-for-partial-tx-checksum.patch -tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch mtd-rawnand-brcmnand-fix-ecc-chunk-calculation-for-erased-page-bitfips.patch s390-dasd-protect-device-queue-against-concurrent-access.patch usb-serial-option-add-luat-air72-u-series-products.patch diff --git a/queue-4.14/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch b/queue-4.14/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch deleted file mode 100644 index 414c56549ac..00000000000 --- a/queue-4.14/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch +++ /dev/null @@ -1,98 +0,0 @@ -From b022f0c7e404887a7c5229788fc99eff9f9a80d5 Mon Sep 17 00:00:00 2001 -From: Francis Laniel -Date: Fri, 20 Oct 2023 13:42:49 +0300 -Subject: tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols - -From: Francis Laniel - -commit b022f0c7e404887a7c5229788fc99eff9f9a80d5 upstream. - -When a kprobe is attached to a function that's name is not unique (is -static and shares the name with other functions in the kernel), the -kprobe is attached to the first function it finds. This is a bug as the -function that it is attaching to is not necessarily the one that the -user wants to attach to. - -Instead of blindly picking a function to attach to what is ambiguous, -error with EADDRNOTAVAIL to let the user know that this function is not -unique, and that the user must use another unique function with an -address offset to get to the function they want to attach to. - -Link: https://lore.kernel.org/all/20231020104250.9537-2-flaniel@linux.microsoft.com/ - -Cc: stable@vger.kernel.org -Fixes: 413d37d1eb69 ("tracing: Add kprobe-based event tracer") -Suggested-by: Masami Hiramatsu -Signed-off-by: Francis Laniel -Link: https://lore.kernel.org/lkml/20230819101105.b0c104ae4494a7d1f2eea742@kernel.org/ -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Masami Hiramatsu (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/trace_kprobe.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 48 insertions(+) - ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -617,6 +617,36 @@ static inline void sanitize_event_name(c - *name = '_'; - } - -+struct count_symbols_struct { -+ const char *func_name; -+ unsigned int count; -+}; -+ -+static int count_symbols(void *data, const char *name, struct module *unused0, -+ unsigned long unused1) -+{ -+ struct count_symbols_struct *args = data; -+ -+ if (strcmp(args->func_name, name)) -+ return 0; -+ -+ args->count++; -+ -+ return 0; -+} -+ -+static unsigned int number_of_same_symbols(char *func_name) -+{ -+ struct count_symbols_struct args = { -+ .func_name = func_name, -+ .count = 0, -+ }; -+ -+ kallsyms_on_each_symbol(count_symbols, &args); -+ -+ return args.count; -+} -+ - static int create_trace_kprobe(int argc, char **argv) - { - /* -@@ -746,6 +776,24 @@ static int create_trace_kprobe(int argc, - } - argc -= 2; argv += 2; - -+ if (symbol && !strchr(symbol, ':')) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(symbol); -+ if (count > 1) -+ /* -+ * Users should use ADDR to remove the ambiguity of -+ * using KSYM only. -+ */ -+ return -EADDRNOTAVAIL; -+ else if (count == 0) -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ return -ENOENT; -+ } -+ - /* setup a probe */ - if (!event) { - /* Make a new event name */ diff --git a/queue-4.19/series b/queue-4.19/series index 14a922e0c5e..677d17e030b 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -12,7 +12,6 @@ amd-xgbe-handle-the-corner-case-during-tx-completion.patch amd-xgbe-propagate-the-correct-speed-and-duplex-stat.patch net-axienet-fix-check-for-partial-tx-checksum.patch mips-kvm-fix-a-build-warning-about-variable-set-but-.patch -tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch arm64-cpufeature-extract-capped-perfmon-fields.patch kvm-arm64-limit-pmu-version-to-pmuv3-for-armv8.1.patch mtd-rawnand-brcmnand-fix-ecc-chunk-calculation-for-erased-page-bitfips.patch diff --git a/queue-4.19/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch b/queue-4.19/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch deleted file mode 100644 index c28089dd591..00000000000 --- a/queue-4.19/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch +++ /dev/null @@ -1,98 +0,0 @@ -From b022f0c7e404887a7c5229788fc99eff9f9a80d5 Mon Sep 17 00:00:00 2001 -From: Francis Laniel -Date: Fri, 20 Oct 2023 13:42:49 +0300 -Subject: tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols - -From: Francis Laniel - -commit b022f0c7e404887a7c5229788fc99eff9f9a80d5 upstream. - -When a kprobe is attached to a function that's name is not unique (is -static and shares the name with other functions in the kernel), the -kprobe is attached to the first function it finds. This is a bug as the -function that it is attaching to is not necessarily the one that the -user wants to attach to. - -Instead of blindly picking a function to attach to what is ambiguous, -error with EADDRNOTAVAIL to let the user know that this function is not -unique, and that the user must use another unique function with an -address offset to get to the function they want to attach to. - -Link: https://lore.kernel.org/all/20231020104250.9537-2-flaniel@linux.microsoft.com/ - -Cc: stable@vger.kernel.org -Fixes: 413d37d1eb69 ("tracing: Add kprobe-based event tracer") -Suggested-by: Masami Hiramatsu -Signed-off-by: Francis Laniel -Link: https://lore.kernel.org/lkml/20230819101105.b0c104ae4494a7d1f2eea742@kernel.org/ -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Masami Hiramatsu (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/trace_kprobe.c | 48 ++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 48 insertions(+) - ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -715,6 +715,36 @@ static inline void sanitize_event_name(c - *name = '_'; - } - -+struct count_symbols_struct { -+ const char *func_name; -+ unsigned int count; -+}; -+ -+static int count_symbols(void *data, const char *name, struct module *unused0, -+ unsigned long unused1) -+{ -+ struct count_symbols_struct *args = data; -+ -+ if (strcmp(args->func_name, name)) -+ return 0; -+ -+ args->count++; -+ -+ return 0; -+} -+ -+static unsigned int number_of_same_symbols(char *func_name) -+{ -+ struct count_symbols_struct args = { -+ .func_name = func_name, -+ .count = 0, -+ }; -+ -+ kallsyms_on_each_symbol(count_symbols, &args); -+ -+ return args.count; -+} -+ - static int create_trace_kprobe(int argc, char **argv) - { - /* -@@ -845,6 +875,24 @@ static int create_trace_kprobe(int argc, - } - argc -= 2; argv += 2; - -+ if (symbol && !strchr(symbol, ':')) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(symbol); -+ if (count > 1) -+ /* -+ * Users should use ADDR to remove the ambiguity of -+ * using KSYM only. -+ */ -+ return -EADDRNOTAVAIL; -+ else if (count == 0) -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ return -ENOENT; -+ } -+ - /* setup a probe */ - if (!event) { - /* Make a new event name */ diff --git a/queue-5.10/series b/queue-5.10/series index b8acfa490a0..d688d29c134 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -46,7 +46,6 @@ ext4-fix-slab-use-after-free-in-ext4_es_insert_exten.patch ext4-make-sure-allocate-pending-entry-not-fail.patch nfsd-lock_rename-needs-both-directories-to-live-on-the-same-fs.patch asoc-simple-card-fixup-asoc_simple_probe-error-handling.patch -tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch acpi-resource-skip-irq-override-on-asus-expertbook-b1402cva.patch swiotlb-xen-provide-the-max_mapping_size-method.patch bcache-replace-a-mistaken-is_err-by-is_err_or_null-in-btree_gc_coalesce.patch diff --git a/queue-5.10/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch b/queue-5.10/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch deleted file mode 100644 index 52751877cbf..00000000000 --- a/queue-5.10/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch +++ /dev/null @@ -1,149 +0,0 @@ -From b022f0c7e404887a7c5229788fc99eff9f9a80d5 Mon Sep 17 00:00:00 2001 -From: Francis Laniel -Date: Fri, 20 Oct 2023 13:42:49 +0300 -Subject: tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols - -From: Francis Laniel - -commit b022f0c7e404887a7c5229788fc99eff9f9a80d5 upstream. - -When a kprobe is attached to a function that's name is not unique (is -static and shares the name with other functions in the kernel), the -kprobe is attached to the first function it finds. This is a bug as the -function that it is attaching to is not necessarily the one that the -user wants to attach to. - -Instead of blindly picking a function to attach to what is ambiguous, -error with EADDRNOTAVAIL to let the user know that this function is not -unique, and that the user must use another unique function with an -address offset to get to the function they want to attach to. - -Link: https://lore.kernel.org/all/20231020104250.9537-2-flaniel@linux.microsoft.com/ - -Cc: stable@vger.kernel.org -Fixes: 413d37d1eb69 ("tracing: Add kprobe-based event tracer") -Suggested-by: Masami Hiramatsu -Signed-off-by: Francis Laniel -Link: https://lore.kernel.org/lkml/20230819101105.b0c104ae4494a7d1f2eea742@kernel.org/ -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Masami Hiramatsu (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/trace_kprobe.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ - kernel/trace/trace_probe.h | 1 - 2 files changed, 75 insertions(+) - ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -715,6 +715,36 @@ static inline void sanitize_event_name(c - *name = '_'; - } - -+struct count_symbols_struct { -+ const char *func_name; -+ unsigned int count; -+}; -+ -+static int count_symbols(void *data, const char *name, struct module *unused0, -+ unsigned long unused1) -+{ -+ struct count_symbols_struct *args = data; -+ -+ if (strcmp(args->func_name, name)) -+ return 0; -+ -+ args->count++; -+ -+ return 0; -+} -+ -+static unsigned int number_of_same_symbols(char *func_name) -+{ -+ struct count_symbols_struct args = { -+ .func_name = func_name, -+ .count = 0, -+ }; -+ -+ kallsyms_on_each_symbol(count_symbols, &args); -+ -+ return args.count; -+} -+ - static int trace_kprobe_create(int argc, const char *argv[]) - { - /* -@@ -842,6 +872,31 @@ static int trace_kprobe_create(int argc, - } - } - -+ if (symbol && !strchr(symbol, ':')) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(symbol); -+ if (count > 1) { -+ /* -+ * Users should use ADDR to remove the ambiguity of -+ * using KSYM only. -+ */ -+ trace_probe_log_err(0, NON_UNIQ_SYMBOL); -+ ret = -EADDRNOTAVAIL; -+ -+ goto error; -+ } else if (count == 0) { -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ trace_probe_log_err(0, BAD_PROBE_ADDR); -+ ret = -ENOENT; -+ -+ goto error; -+ } -+ } -+ - trace_probe_log_set_index(0); - if (event) { - ret = traceprobe_parse_event_name(&event, &group, buf, -@@ -1805,6 +1860,7 @@ static int unregister_kprobe_event(struc - } - - #ifdef CONFIG_PERF_EVENTS -+ - /* create a trace_kprobe, but don't add it to global lists */ - struct trace_event_call * - create_local_trace_kprobe(char *func, void *addr, unsigned long offs, -@@ -1814,6 +1870,24 @@ create_local_trace_kprobe(char *func, vo - int ret; - char *event; - -+ if (func) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(func); -+ if (count > 1) -+ /* -+ * Users should use addr to remove the ambiguity of -+ * using func only. -+ */ -+ return ERR_PTR(-EADDRNOTAVAIL); -+ else if (count == 0) -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ return ERR_PTR(-ENOENT); -+ } -+ - /* - * local trace_kprobes are not added to dyn_event, so they are never - * searched in find_trace_kprobe(). Therefore, there is no concern of ---- a/kernel/trace/trace_probe.h -+++ b/kernel/trace/trace_probe.h -@@ -390,6 +390,7 @@ extern int traceprobe_define_arg_fields( - C(BAD_MAXACT, "Invalid maxactive number"), \ - C(MAXACT_TOO_BIG, "Maxactive is too big"), \ - C(BAD_PROBE_ADDR, "Invalid probed address or symbol"), \ -+ C(NON_UNIQ_SYMBOL, "The symbol is not unique"), \ - C(BAD_RETPROBE, "Retprobe address must be an function entry"), \ - C(BAD_ADDR_SUFFIX, "Invalid probed address suffix"), \ - C(NO_GROUP_NAME, "Group name is not specified"), \ diff --git a/queue-5.15/series b/queue-5.15/series index 57db4a2cf16..1d76f3621ff 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -39,7 +39,6 @@ ext4-using-nofail-preallocation-in-ext4_es_insert_de.patch ext4-using-nofail-preallocation-in-ext4_es_insert_ex.patch ext4-fix-slab-use-after-free-in-ext4_es_insert_exten.patch ext4-make-sure-allocate-pending-entry-not-fail.patch -tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch proc-sysctl-prevent-aliased-sysctls-from-getting-passed-to-init.patch acpi-resource-skip-irq-override-on-asus-expertbook-b1402cva.patch swiotlb-xen-provide-the-max_mapping_size-method.patch diff --git a/queue-5.15/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch b/queue-5.15/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch deleted file mode 100644 index b9524893ae2..00000000000 --- a/queue-5.15/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch +++ /dev/null @@ -1,149 +0,0 @@ -From b022f0c7e404887a7c5229788fc99eff9f9a80d5 Mon Sep 17 00:00:00 2001 -From: Francis Laniel -Date: Fri, 20 Oct 2023 13:42:49 +0300 -Subject: tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols - -From: Francis Laniel - -commit b022f0c7e404887a7c5229788fc99eff9f9a80d5 upstream. - -When a kprobe is attached to a function that's name is not unique (is -static and shares the name with other functions in the kernel), the -kprobe is attached to the first function it finds. This is a bug as the -function that it is attaching to is not necessarily the one that the -user wants to attach to. - -Instead of blindly picking a function to attach to what is ambiguous, -error with EADDRNOTAVAIL to let the user know that this function is not -unique, and that the user must use another unique function with an -address offset to get to the function they want to attach to. - -Link: https://lore.kernel.org/all/20231020104250.9537-2-flaniel@linux.microsoft.com/ - -Cc: stable@vger.kernel.org -Fixes: 413d37d1eb69 ("tracing: Add kprobe-based event tracer") -Suggested-by: Masami Hiramatsu -Signed-off-by: Francis Laniel -Link: https://lore.kernel.org/lkml/20230819101105.b0c104ae4494a7d1f2eea742@kernel.org/ -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Masami Hiramatsu (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/trace_kprobe.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ - kernel/trace/trace_probe.h | 1 - 2 files changed, 75 insertions(+) - ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -708,6 +708,36 @@ static struct notifier_block trace_kprob - .priority = 1 /* Invoked after kprobe module callback */ - }; - -+struct count_symbols_struct { -+ const char *func_name; -+ unsigned int count; -+}; -+ -+static int count_symbols(void *data, const char *name, struct module *unused0, -+ unsigned long unused1) -+{ -+ struct count_symbols_struct *args = data; -+ -+ if (strcmp(args->func_name, name)) -+ return 0; -+ -+ args->count++; -+ -+ return 0; -+} -+ -+static unsigned int number_of_same_symbols(char *func_name) -+{ -+ struct count_symbols_struct args = { -+ .func_name = func_name, -+ .count = 0, -+ }; -+ -+ kallsyms_on_each_symbol(count_symbols, &args); -+ -+ return args.count; -+} -+ - static int __trace_kprobe_create(int argc, const char *argv[]) - { - /* -@@ -836,6 +866,31 @@ static int __trace_kprobe_create(int arg - } - } - -+ if (symbol && !strchr(symbol, ':')) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(symbol); -+ if (count > 1) { -+ /* -+ * Users should use ADDR to remove the ambiguity of -+ * using KSYM only. -+ */ -+ trace_probe_log_err(0, NON_UNIQ_SYMBOL); -+ ret = -EADDRNOTAVAIL; -+ -+ goto error; -+ } else if (count == 0) { -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ trace_probe_log_err(0, BAD_PROBE_ADDR); -+ ret = -ENOENT; -+ -+ goto error; -+ } -+ } -+ - trace_probe_log_set_index(0); - if (event) { - ret = traceprobe_parse_event_name(&event, &group, buf, -@@ -1755,6 +1810,7 @@ static int unregister_kprobe_event(struc - } - - #ifdef CONFIG_PERF_EVENTS -+ - /* create a trace_kprobe, but don't add it to global lists */ - struct trace_event_call * - create_local_trace_kprobe(char *func, void *addr, unsigned long offs, -@@ -1765,6 +1821,24 @@ create_local_trace_kprobe(char *func, vo - int ret; - char *event; - -+ if (func) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(func); -+ if (count > 1) -+ /* -+ * Users should use addr to remove the ambiguity of -+ * using func only. -+ */ -+ return ERR_PTR(-EADDRNOTAVAIL); -+ else if (count == 0) -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ return ERR_PTR(-ENOENT); -+ } -+ - /* - * local trace_kprobes are not added to dyn_event, so they are never - * searched in find_trace_kprobe(). Therefore, there is no concern of ---- a/kernel/trace/trace_probe.h -+++ b/kernel/trace/trace_probe.h -@@ -405,6 +405,7 @@ extern int traceprobe_define_arg_fields( - C(BAD_MAXACT, "Invalid maxactive number"), \ - C(MAXACT_TOO_BIG, "Maxactive is too big"), \ - C(BAD_PROBE_ADDR, "Invalid probed address or symbol"), \ -+ C(NON_UNIQ_SYMBOL, "The symbol is not unique"), \ - C(BAD_RETPROBE, "Retprobe address must be an function entry"), \ - C(BAD_ADDR_SUFFIX, "Invalid probed address suffix"), \ - C(NO_GROUP_NAME, "Group name is not specified"), \ diff --git a/queue-5.4/series b/queue-5.4/series index 8081d0ea108..d98da851627 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -28,7 +28,6 @@ ext4-using-nofail-preallocation-in-ext4_es_insert_de.patch ext4-using-nofail-preallocation-in-ext4_es_insert_ex.patch ext4-fix-slab-use-after-free-in-ext4_es_insert_exten.patch ext4-make-sure-allocate-pending-entry-not-fail.patch -tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch arm64-cpufeature-extract-capped-perfmon-fields.patch kvm-arm64-limit-pmu-version-to-pmuv3-for-armv8.1.patch acpi-resource-skip-irq-override-on-asus-expertbook-b1402cva.patch diff --git a/queue-5.4/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch b/queue-5.4/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch deleted file mode 100644 index eae4c1614c4..00000000000 --- a/queue-5.4/tracing-kprobes-return-eaddrnotavail-when-func-matches-several-symbols.patch +++ /dev/null @@ -1,149 +0,0 @@ -From b022f0c7e404887a7c5229788fc99eff9f9a80d5 Mon Sep 17 00:00:00 2001 -From: Francis Laniel -Date: Fri, 20 Oct 2023 13:42:49 +0300 -Subject: tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols - -From: Francis Laniel - -commit b022f0c7e404887a7c5229788fc99eff9f9a80d5 upstream. - -When a kprobe is attached to a function that's name is not unique (is -static and shares the name with other functions in the kernel), the -kprobe is attached to the first function it finds. This is a bug as the -function that it is attaching to is not necessarily the one that the -user wants to attach to. - -Instead of blindly picking a function to attach to what is ambiguous, -error with EADDRNOTAVAIL to let the user know that this function is not -unique, and that the user must use another unique function with an -address offset to get to the function they want to attach to. - -Link: https://lore.kernel.org/all/20231020104250.9537-2-flaniel@linux.microsoft.com/ - -Cc: stable@vger.kernel.org -Fixes: 413d37d1eb69 ("tracing: Add kprobe-based event tracer") -Suggested-by: Masami Hiramatsu -Signed-off-by: Francis Laniel -Link: https://lore.kernel.org/lkml/20230819101105.b0c104ae4494a7d1f2eea742@kernel.org/ -Acked-by: Masami Hiramatsu (Google) -Signed-off-by: Masami Hiramatsu (Google) -Signed-off-by: Greg Kroah-Hartman ---- - kernel/trace/trace_kprobe.c | 74 ++++++++++++++++++++++++++++++++++++++++++++ - kernel/trace/trace_probe.h | 1 - 2 files changed, 75 insertions(+) - ---- a/kernel/trace/trace_kprobe.c -+++ b/kernel/trace/trace_kprobe.c -@@ -714,6 +714,36 @@ static inline void sanitize_event_name(c - *name = '_'; - } - -+struct count_symbols_struct { -+ const char *func_name; -+ unsigned int count; -+}; -+ -+static int count_symbols(void *data, const char *name, struct module *unused0, -+ unsigned long unused1) -+{ -+ struct count_symbols_struct *args = data; -+ -+ if (strcmp(args->func_name, name)) -+ return 0; -+ -+ args->count++; -+ -+ return 0; -+} -+ -+static unsigned int number_of_same_symbols(char *func_name) -+{ -+ struct count_symbols_struct args = { -+ .func_name = func_name, -+ .count = 0, -+ }; -+ -+ kallsyms_on_each_symbol(count_symbols, &args); -+ -+ return args.count; -+} -+ - static int trace_kprobe_create(int argc, const char *argv[]) - { - /* -@@ -825,6 +855,31 @@ static int trace_kprobe_create(int argc, - } - } - -+ if (symbol && !strchr(symbol, ':')) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(symbol); -+ if (count > 1) { -+ /* -+ * Users should use ADDR to remove the ambiguity of -+ * using KSYM only. -+ */ -+ trace_probe_log_err(0, NON_UNIQ_SYMBOL); -+ ret = -EADDRNOTAVAIL; -+ -+ goto error; -+ } else if (count == 0) { -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ trace_probe_log_err(0, BAD_PROBE_ADDR); -+ ret = -ENOENT; -+ -+ goto error; -+ } -+ } -+ - trace_probe_log_set_index(0); - if (event) { - ret = traceprobe_parse_event_name(&event, &group, buf, -@@ -1596,6 +1651,7 @@ static int unregister_kprobe_event(struc - } - - #ifdef CONFIG_PERF_EVENTS -+ - /* create a trace_kprobe, but don't add it to global lists */ - struct trace_event_call * - create_local_trace_kprobe(char *func, void *addr, unsigned long offs, -@@ -1605,6 +1661,24 @@ create_local_trace_kprobe(char *func, vo - int ret; - char *event; - -+ if (func) { -+ unsigned int count; -+ -+ count = number_of_same_symbols(func); -+ if (count > 1) -+ /* -+ * Users should use addr to remove the ambiguity of -+ * using func only. -+ */ -+ return ERR_PTR(-EADDRNOTAVAIL); -+ else if (count == 0) -+ /* -+ * We can return ENOENT earlier than when register the -+ * kprobe. -+ */ -+ return ERR_PTR(-ENOENT); -+ } -+ - /* - * local trace_kprobes are not added to dyn_event, so they are never - * searched in find_trace_kprobe(). Therefore, there is no concern of ---- a/kernel/trace/trace_probe.h -+++ b/kernel/trace/trace_probe.h -@@ -403,6 +403,7 @@ extern int traceprobe_define_arg_fields( - C(BAD_MAXACT, "Invalid maxactive number"), \ - C(MAXACT_TOO_BIG, "Maxactive is too big"), \ - C(BAD_PROBE_ADDR, "Invalid probed address or symbol"), \ -+ C(NON_UNIQ_SYMBOL, "The symbol is not unique"), \ - C(BAD_RETPROBE, "Retprobe address must be an function entry"), \ - C(NO_GROUP_NAME, "Group name is not specified"), \ - C(GROUP_TOO_LONG, "Group name is too long"), \