Message ID | 20191108144042.30245-4-philmd@redhat.com |
---|---|
State | New |
Headers | show |
Series | hw: Remove dynamic field width from trace events | expand |
On 11/8/19 8:40 AM, Philippe Mathieu-Daudé wrote: > Since not all trace backends support dynamic field width in > format (dtrace via stap does not), forbid them. > > Add a check to refuse field width in new formats: > > +++ b/scripts/tracetool/__init__.py > @@ -206,6 +206,7 @@ class Event(object): > "\s*" > "(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?" > "\s*") > + _DFWRE = re.compile(".*(%0?\*).*") The use of leading and trailing .* is pointless if the RE itself is used unanchored and where you only care if the () matched. This doesn't catch all valid uses of * in a printf format. Better might be something like: _DFWRE = re.compile("%[\d\.\- +#']*\*") which matches only if there is a %, any number of characters that can form a printf flag, as well as a numeric field width but dynamic precision. > + if Event._DFWRE.match(fmt): > + raise ValueError("Event format must not contain field width '%*'") > > if len(fmt_trans) > 0: > fmt = [fmt_trans, fmt] >
On 11/8/19 10:07 AM, Eric Blake wrote: > On 11/8/19 8:40 AM, Philippe Mathieu-Daudé wrote: >> Since not all trace backends support dynamic field width in >> format (dtrace via stap does not), forbid them. >> >> Add a check to refuse field width in new formats: >> > >> +++ b/scripts/tracetool/__init__.py >> @@ -206,6 +206,7 @@ class Event(object): >> "\s*" >> "(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?" >> "\s*") >> + _DFWRE = re.compile(".*(%0?\*).*") > > The use of leading and trailing .* is pointless if the RE itself is used > unanchored and where you only care if the () matched. Following up on this (based on an IRC conversation): re.match _is_ anchored by default, while re.search is unanchored > > This doesn't catch all valid uses of * in a printf format. Better might > be something like: > > _DFWRE = re.compile("%[\d\.\- +#']*\*") > > which matches only if there is a %, any number of characters that can > form a printf flag, as well as a numeric field width but dynamic precision. > > >> + if Event._DFWRE.match(fmt): Or put differently, if you want to drop the .* from the compiled regex, then you need to use .search(fmt) here rather than .match(fmt).
diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py index 44c118bc2a..e239be602b 100644 --- a/scripts/tracetool/__init__.py +++ b/scripts/tracetool/__init__.py @@ -206,6 +206,7 @@ class Event(object): "\s*" "(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?" "\s*") + _DFWRE = re.compile(".*(%0?\*).*") _VALID_PROPS = set(["disable", "tcg", "tcg-trans", "tcg-exec", "vcpu"]) @@ -280,6 +281,8 @@ class Event(object): if fmt.endswith(r'\n"'): raise ValueError("Event format must not end with a newline " "character") + if Event._DFWRE.match(fmt): + raise ValueError("Event format must not contain field width '%*'") if len(fmt_trans) > 0: fmt = [fmt_trans, fmt]
Since not all trace backends support dynamic field width in format (dtrace via stap does not), forbid them. Add a check to refuse field width in new formats: $ make [...] GEN hw/block/trace.h Traceback (most recent call last): File "scripts/tracetool.py", line 152, in <module> main(sys.argv) File "scripts/tracetool.py", line 143, in main events.extend(tracetool.read_events(fh, arg)) File "scripts/tracetool/__init__.py", line 371, in read_events event = Event.build(line) File "scripts/tracetool/__init__.py", line 285, in build raise ValueError("Event format must not contain field width '%*'") ValueError: Error at hw/block/trace-events:11: Event format must not contain field width '%*' Reported-by: Eric Blake <eblake@redhat.com> Buglink: https://bugs.launchpad.net/qemu/+bug/1844817 Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- scripts/tracetool/__init__.py | 3 +++ 1 file changed, 3 insertions(+)