From nobody Sun Feb 8 10:03:28 2026 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F6F9357717 for ; Mon, 12 Jan 2026 13:22:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768224132; cv=none; b=i+sPQ062ACi82cdVZaMhTZ7kYRTF2wlcN7Gm3ATM2SOC+44RaakOQPQWzun9T3GxqoYIHxrNhZBcIUhAlOPMs3QGUqdJ71WBoRY/Vh2Jr+/SHVTgQuqWJ4bRPn1+9D5EUg9ofQZ5iUk8CofvGX/Jb8fnNbG/WZTW/jos7ADKBgs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768224132; c=relaxed/simple; bh=NXluUWsGUJWbvUwBY8QcwnUX2+oyPNqQQeow5Lv3DsI=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=a2+ngqYQUf0z7CMVriMB/KBt1P0HlL2fsBoEGteZRK1yBoyOcYcpxeqnfM94nXIITcP+U71aS0VK7q070mRbVviU7NUbUX7NFLGZlmGMMCUdIL4yu850qH0IjRZ+3hwHJt8OSbsQeKpiilMwNqE0KttOqMaf/lVB7HRBkFEQKGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=JNQvnUWq; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=lab1DnPg; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="JNQvnUWq"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="lab1DnPg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1768224130; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=Q4s+OdLx4i189wcto/R0uWmzncKq8UkLGmJxKDFcZ3U=; b=JNQvnUWqyakOLGDXN3fGOD7FcBslGyISaft/5jdAQt9Sc977imVN9iKIdNbGFA2DYEV1Pz SicBUhvbwKG/5c4zbrR+Itm6UJFcB2RvVyjZAsJNSfXWq6u6ycCZ9szlTjbKjpOo62q0tD j3nV+0pq1RxNyLnljh1y9wM1+Udgu+Y= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-612-6Up8ZHKONYKvD1CJW0t9fg-1; Mon, 12 Jan 2026 08:22:09 -0500 X-MC-Unique: 6Up8ZHKONYKvD1CJW0t9fg-1 X-Mimecast-MFC-AGG-ID: 6Up8ZHKONYKvD1CJW0t9fg_1768224128 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-47d5c7a2f5dso57337315e9.2 for ; Mon, 12 Jan 2026 05:22:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1768224128; x=1768828928; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=Q4s+OdLx4i189wcto/R0uWmzncKq8UkLGmJxKDFcZ3U=; b=lab1DnPgVvrcwmYFypwAetsJrk10AXF17MeGoDMA87tE2CZjwskSH6ajhZ5WYGpP94 3EqMONf8/0XI7/crGq8csjDbLqeRZ9yEgLQQYceU40TaC7SEdxhchvbLGQsr/t1K4Xcp yWQZYF7H9iBNukj4laC+3Ay5whPrAOP1eq5X+ZXoYtKpcVg0K0C8i7HS/nCCMtBkcpfd xd3oc5DY0xK/q5O6VnlOnG8tJDUYvjYNFMOkGBlgkUnBALWAynDNRxip5WftCxxDCpjy WMI5rV8XMFZdJfmTLIoVQOlNtm5BNcSNOe4q6SXXhFAOoOCvn5UPe4JfAL5B/BXrJceA KS+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768224128; x=1768828928; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Q4s+OdLx4i189wcto/R0uWmzncKq8UkLGmJxKDFcZ3U=; b=Lft8BN/2J9elCGQa5DFmjBM9kE4RtQFEF65QFBSyHkmDZ5uztRoaeIaFa41JcLyEcT uhTKe8XmvvM1r7ycoCTyQPUXd27Blqjwp+sgJIr0GrrwtRD6fuP09BO3xgqgqCCMx2Np yyBMjx7Q52zfbbg+XtZJ//4JndEf2Ruy7avP3aELenyeU63m0uRYxXm0DJAD9AAIX7U7 +OobjkevloyE4cymvpJi9KbsTHLqtV0xgz4IfTG7yWge16yMo8HdPTcT1Viz0Ex2xuC1 AphTW0cGF9FDUgiHvrR3h9m1q2Lj8tYRGa+NrZgG7GRdQp3TQcH1ml11Lpe+eoOXgnAv aL0w== X-Forwarded-Encrypted: i=1; AJvYcCWgzQRo82B23ygbqMHb6vcBQJJAVg+VH5PPGlZ1u61L/NVih6gTm+W4mzgMj2dWevNKIIgz5d7e/7bHCg0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy0U6PFrO2SAq8suv+oONhXqqiwDIB2RbP9q27Kz2ZMmEuFd2fn teqPLwlZ1D2V9ZHp9YYkYi67ji0G0NQboO+4uCZhDyjl79ht9chIre54j8sZ4dN/YYc92X/ZeGK VberpxXCd4zg8aL5D3mHvSdvnwXLDOzVR38e6yoqWLw8fle/GQrpSqPwyNt2IIIHAPQ== X-Gm-Gg: AY/fxX6P+0kX5Dtb3Qrz7d54C72ZvHAefVTRNcikiMfdzof9PxqCTx7CavjSs4UtJ/K Vhxyxp0ynxeKINsheZbS3gpX25qW7O/1B+jmIN+TG7b2o3acjTKkGzd/qPD7SXUXqflaENO/jT5 JQEhEHAgQ3CUyud8GDC2WRn7Du7PMHo6wQI/KXAx6oERMUUjH7gkffb8XcGcznpVvzuM8dTa5Vk w3+Agysmw4SXdqqmTmRZQYhYOWHy40oviZGJ0JR5cjZzFC6KI2nw48yQEutZpKr7u8KQd+khO88 tlmYEOe05E7MA8OcHyDwfDzo7SRyW3bmj+yJY+9TWrV9pgCDB/9vLysUE7zHX0Q7IL08VtY4nJQ jUIsDlL9DKfl3GG4UauIlRm5s X-Received: by 2002:a05:600c:64cc:b0:465:a51d:d4 with SMTP id 5b1f17b1804b1-47d84b09250mr195011285e9.6.1768224127539; Mon, 12 Jan 2026 05:22:07 -0800 (PST) X-Google-Smtp-Source: AGHT+IHDJ6tQs4rCkcz2rRpswvhE3OYFURr3aglB5GxYqkRI9WjKRZzWoUkm0sPtVtevYCQc/Y+8fQ== X-Received: by 2002:a05:600c:64cc:b0:465:a51d:d4 with SMTP id 5b1f17b1804b1-47d84b09250mr195011025e9.6.1768224127058; Mon, 12 Jan 2026 05:22:07 -0800 (PST) Received: from costa-tp.redhat.com ([2a00:a041:e23c:600:cadf:120:2b7f:a706]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-47d86637b90sm139400205e9.2.2026.01.12.05.22.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 05:22:06 -0800 (PST) From: Costa Shulyupin To: Steven Rostedt , Tomas Glozar , Wander Lairson Costa , Costa Shulyupin , Ivan Pravdin , Tiezhu Yang , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH v1] tools/rtla: Fix parse_cpu_set() and add unit test Date: Mon, 12 Jan 2026 15:21:28 +0200 Message-ID: <20260112132140.156956-1-costa.shul@redhat.com> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The patch "Replace atoi() with a robust strtoi()" introduced a bug in parse_cpu_set(), which relies on partial parsing of the input string. Restore the original use of atoi() in parse_cpu_set(). Add a unit test to prevent accidental regressions. Fixes: 7e9dfccf8f11 ("rtla: Replace atoi() with a robust strtoi()") Signed-off-by: Costa Shulyupin --- tools/tracing/rtla/Makefile | 3 ++ tools/tracing/rtla/src/utils.c | 10 ++-- tools/tracing/rtla/tests/Makefile | 12 +++++ tools/tracing/rtla/tests/test_utils.c | 74 +++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 tools/tracing/rtla/tests/Makefile create mode 100644 tools/tracing/rtla/tests/test_utils.c diff --git a/tools/tracing/rtla/Makefile b/tools/tracing/rtla/Makefile index 2701256abaf3..1805916c7dba 100644 --- a/tools/tracing/rtla/Makefile +++ b/tools/tracing/rtla/Makefile @@ -109,7 +109,10 @@ clean: doc_clean fixdep-clean $(Q)rm -f rtla rtla-static fixdep FEATURE-DUMP rtla-* $(Q)rm -rf feature $(Q)rm -f src/timerlat.bpf.o src/timerlat.skel.h example/timerlat_bpf_act= ion.o + check: $(RTLA) tests/bpf/bpf_action_map.o + make -C tests/ check RTLA=3D$(RTLA) BPFTOOL=3D$(SYSTEM_BPFTOOL) prove -o -f -v tests/ + examples: example/timerlat_bpf_action.o .PHONY: FORCE clean check diff --git a/tools/tracing/rtla/src/utils.c b/tools/tracing/rtla/src/utils.c index 18986a5aed3c..0da3b2470c31 100644 --- a/tools/tracing/rtla/src/utils.c +++ b/tools/tracing/rtla/src/utils.c @@ -128,18 +128,16 @@ int parse_cpu_set(char *cpu_list, cpu_set_t *set) nr_cpus =3D sysconf(_SC_NPROCESSORS_CONF); =20 for (p =3D cpu_list; *p; ) { - if (strtoi(p, &cpu)) - goto err; - if (cpu < 0 || cpu >=3D nr_cpus) + cpu =3D atoi(p); + if (cpu < 0 || (!cpu && *p !=3D '0') || cpu >=3D nr_cpus) goto err; =20 while (isdigit(*p)) p++; if (*p =3D=3D '-') { p++; - if (strtoi(p, &end_cpu)) - goto err; - if (end_cpu < cpu || end_cpu >=3D nr_cpus) + end_cpu =3D atoi(p); + if (end_cpu < cpu || (!end_cpu && *p !=3D '0') || end_cpu >=3D nr_cpus) goto err; while (isdigit(*p)) p++; diff --git a/tools/tracing/rtla/tests/Makefile b/tools/tracing/rtla/tests/M= akefile new file mode 100644 index 000000000000..fe187306a404 --- /dev/null +++ b/tools/tracing/rtla/tests/Makefile @@ -0,0 +1,12 @@ +LIBS :=3D -lcheck + +test_utils: test_utils.c ../src/utils.c + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +check: test_utils + ./test_utils + +clean: + rm -f test_utils + +.PHONY: check clean diff --git a/tools/tracing/rtla/tests/test_utils.c b/tools/tracing/rtla/tes= ts/test_utils.c new file mode 100644 index 000000000000..92ed49d60d33 --- /dev/null +++ b/tools/tracing/rtla/tests/test_utils.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Unit tests for src/utils.c parsing functions + */ + +#define _GNU_SOURCE +#include +#include + +#include "../src/utils.h" + +START_TEST(test_parse_cpu_set) +{ + cpu_set_t set; + int nr_cpus =3D sysconf(_SC_NPROCESSORS_CONF); + + ck_assert_int_eq(parse_cpu_set("0", &set), 0); + ck_assert(CPU_ISSET(0, &set)); + ck_assert(!CPU_ISSET(1, &set)); + + if (nr_cpus > 2) { + ck_assert_int_eq(parse_cpu_set("0,2", &set), 0); + ck_assert(CPU_ISSET(0, &set)); + ck_assert(CPU_ISSET(2, &set)); + } + + if (nr_cpus > 3) { + ck_assert_int_eq(parse_cpu_set("0-3", &set), 0); + ck_assert(CPU_ISSET(0, &set)); + ck_assert(CPU_ISSET(1, &set)); + ck_assert(CPU_ISSET(2, &set)); + ck_assert(CPU_ISSET(3, &set)); + } + + if (nr_cpus > 5) { + ck_assert_int_eq(parse_cpu_set("1-3,5", &set), 0); + ck_assert(!CPU_ISSET(0, &set)); + ck_assert(CPU_ISSET(1, &set)); + ck_assert(CPU_ISSET(2, &set)); + ck_assert(CPU_ISSET(3, &set)); + ck_assert(!CPU_ISSET(4, &set)); + ck_assert(CPU_ISSET(5, &set)); + } + + ck_assert_int_ne(parse_cpu_set("-1", &set), 0); + ck_assert_int_ne(parse_cpu_set("abc", &set), 0); + ck_assert_int_ne(parse_cpu_set("9999", &set), 0); +} +END_TEST + +Suite *utils_suite(void) +{ + Suite *s =3D suite_create("utils"); + TCase *tc =3D tcase_create("core"); + + tcase_add_test(tc, test_parse_cpu_set); + + suite_add_tcase(s, tc); + return s; +} + +int main(void) +{ + int num_failed; + SRunner *sr; + + sr =3D srunner_create(utils_suite()); + srunner_run_all(sr, CK_NORMAL); + num_failed =3D srunner_ntests_failed(sr); + + srunner_free(sr); + + return (num_failed =3D=3D 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} --=20 2.52.0