ps: restore aix behavior while keeping an original fix

The commit shown below broke the aix behavior that Dr.
Fink recently reported. However, in the proposed patch
the old behavior, showing garbage when '%cpu' was used
with an invalid formatting option, would appear again.

So this patch, based on Werner's patch, goes the extra
distance to prevent that. Along the way we'll disallow
commas in the aix format str to prevent their display.

Reference(s):
https://www.freelists.org/post/procps/Procpsng-400-released-with-newlib,2
. Mar, 2022 - where aix bug was introduced
commit 81df85a1b5

Prototyped-by: Dr. Werner Fink <werner@suse.de>
Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2022-03-30 12:00:00 -05:00 committed by Craig Small
parent 28c50b8564
commit 8cb646bdfc
2 changed files with 7 additions and 5 deletions

View File

@ -592,7 +592,7 @@ static void finalize_stacks (void)
// now accommodate any results not yet satisfied // now accommodate any results not yet satisfied
f_node = format_list; f_node = format_list;
while (f_node) { while (f_node) {
(*f_node->pr)(NULL, NULL); if (*f_node->pr) (*f_node->pr)(NULL, NULL);
f_node = f_node->next; f_node = f_node->next;
} }
s_node = sort_list; s_node = sort_list;

View File

@ -132,17 +132,20 @@ static const char *aix_format_parse(sf_node *sfn){
c = *walk++; c = *walk++;
if(c=='%') goto get_desc; if(c=='%') goto get_desc;
if(!c) goto looks_ok; if(!c) goto looks_ok;
if(c==',') goto aix_oops;
/* get_text: */ /* get_text: */
items++; items++;
get_more_text: get_more:
c = *walk++; c = *walk++;
if(c=='%') goto get_desc; if(c=='%') goto get_desc;
if(c) goto get_more_text; if(c==' ') goto get_more;
if(c) goto aix_oops;
goto looks_ok; goto looks_ok;
get_desc: get_desc:
items++; items++;
c = *walk++; c = *walk++;
if(c) goto initial; if(c) goto initial;
aix_oops:
return _("improper AIX field descriptor"); return _("improper AIX field descriptor");
looks_ok: looks_ok:
; ;
@ -313,8 +316,7 @@ static const char *format_parse(sf_node *sfn){
if(0) improper: err=_("improper format list"); if(0) improper: err=_("improper format list");
if(0) badwidth: err=_("column widths must be unsigned decimal numbers"); if(0) badwidth: err=_("column widths must be unsigned decimal numbers");
if(0) notmacro: err=_("can not set width for a macro (multi-column) format specifier"); if(0) notmacro: err=_("can not set width for a macro (multi-column) format specifier");
if (!err) if(strchr(sfn->sf,'%')) err = aix_format_parse(sfn);
if(strchr(sfn->sf,'%')) err = aix_format_parse(sfn);
return err; return err;
} }