Ășt 2. 6. 2026 v 14:55 odesĂlatel Tomas Glozar <[email protected]> napsal: > > A bug was reported where the parsing of multi-character short options, > be it a short option with an argument specified without space (e.g. > "-p100") or multiple short options in one argument (e.g. -un), ignores > options specific to individual tools. > > Furthermore, if the rest of the option is supposed to be an argument, it > gets reinterpreted as a string of options. For example, -p100 gets > interpreted as -100, which is due to hackish implementation read as > --no-thread --no-irq --no-irq with timerlat hist, causing rtla to error > out: > > $ rtla timerlat hist -p100 > no-irq and no-thread set, there is nothing to do here > > This behavior is caused by getopt_long() being called twice on each > argument, once in common_parse_options(), once in [tool]_parse_args(): > > - common_parse_options() calls getopt_long() with an array of options > common for all rtla tools, while suppressing errors (opterr = 0). > - If the option fails to parse, common_parse_options() returns 0. > - If 0 is returned from common_parse_options(), [tool]_parse_args() > calls getopt_long() again, with its own set of options. > > * [tool] means one of {osnoise,timerlat}_{top,hist} > > At least in glibc, getopt_long() increments its internal nextchar > variable even if the option is not recognized. That means that in the > case of "-p100", common_parse_options() sets nextchar pointing to '1', > and timerlat_hist_parse_args() sees '1', not 'p'; the same then repeats > for the first and second '0'. > > As there is no way to restore the correct internal state of > getopt_long() reliably, fix the issue by merging the common options back > to the longopt array and option string of the [tool]_parse_args() > functions using a macro; only the switch part is left in the original > function, which is renamed to set_common_option(). > > Fixes: 850cd24cb6d6 ("tools/rtla: Add common_parse_options()") > Reported-by: John Kacur <[email protected]> > Signed-off-by: Tomas Glozar <[email protected]> > ---
Forgot to add note to the original email: This fix is only for 7.1, 7.0 needs tweaking of the commit, 7.2 will remove the command line parsing logic entirely and replace it with libsubcmd, where this works. Tomas
