Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rtla: Enforce exact match for time unit suffixes

The parse_ns_duration() function currently uses prefix matching for
detecting time units. This approach is problematic as it silently
accepts malformed strings such as "100nsx" or "100us_invalid" by
ignoring the trailing characters, leading to potential configuration
errors.

Introduce a match_time_unit() helper that checks the suffix matches
exactly and is followed by either end-of-string or a ':' delimiter.
The ':' is needed because parse_ns_duration() is also called from
get_long_ns_after_colon() when parsing SCHED_DEADLINE priority
specifications in the format "d:runtime:period" (e.g., "d:10ms:100ms").

A plain strcmp() would reject valid deadline strings because the suffix
"ms" is followed by ":100ms", not end-of-string. Similarly,
strncmp_static() would fail because ARRAY_SIZE() includes the NUL
terminator, making it equivalent to strcmp() for this comparison.

The match_time_unit() helper solves both problems: it rejects malformed
input like "100msx" while correctly handling the colon-delimited
deadline format.

Signed-off-by: Wander Lairson Costa <wander@redhat.com>
Link: https://lore.kernel.org/r/20260309195040.1019085-13-wander@redhat.com
Signed-off-by: Tomas Glozar <tglozar@redhat.com>

authored by

Wander Lairson Costa and committed by
Tomas Glozar
b3910a73 265905df

+19 -4
+19 -4
tools/tracing/rtla/src/utils.c
··· 214 214 } 215 215 216 216 /* 217 + * match_time_unit - check if str starts with unit followed by end-of-string or ':' 218 + * 219 + * This allows the time unit parser to work both in standalone duration strings 220 + * like "100ms" and in colon-delimited SCHED_DEADLINE specifications like 221 + * "d:10ms:100ms", while still rejecting malformed input like "100msx". 222 + */ 223 + static bool match_time_unit(const char *str, const char *unit) 224 + { 225 + size_t len = strlen(unit); 226 + 227 + return strncmp(str, unit, len) == 0 && 228 + (str[len] == '\0' || str[len] == ':'); 229 + } 230 + 231 + /* 217 232 * parse_ns_duration - parse duration with ns/us/ms/s converting it to nanoseconds 218 233 */ 219 234 long parse_ns_duration(char *val) ··· 239 224 t = strtol(val, &end, 10); 240 225 241 226 if (end) { 242 - if (!strncmp(end, "ns", 2)) { 227 + if (match_time_unit(end, "ns")) { 243 228 return t; 244 - } else if (!strncmp(end, "us", 2)) { 229 + } else if (match_time_unit(end, "us")) { 245 230 t *= 1000; 246 231 return t; 247 - } else if (!strncmp(end, "ms", 2)) { 232 + } else if (match_time_unit(end, "ms")) { 248 233 t *= 1000 * 1000; 249 234 return t; 250 - } else if (!strncmp(end, "s", 1)) { 235 + } else if (match_time_unit(end, "s")) { 251 236 t *= 1000 * 1000 * 1000; 252 237 return t; 253 238 }