[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[BUG] ps hangs when given "-o user".
From: |
Cyril Roelandt |
Subject: |
[BUG] ps hangs when given "-o user". |
Date: |
Mon, 10 Dec 2012 01:45:55 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:10.0.10) Gecko/20121027 Icedove/10.0.10 |
Hello,
The following command hangs:
$ ps -o user -p 1
Funnily enough, this works as expected:
$ ps -o user, -p 1
User
root
I took a look at the code:
1) with "-o user", the "fmt_string" variable is set to "user", and the
"posix_fmt" variable is set to 1 (see utils/ps.c):
case 'o': fmt_string = arg; posix_fmt = 1; break;
2) fmt_string is later overriden because "user" can be found in
"output_fmts". Its new value is "%^%user %pid %th %cpu %mem %sz %rss %tt
%sc %stat %start %time %command" (see utils/ps.c)
case ARGP_KEY_SUCCESS:
/* Select an explicit format string if FMT_STRING is a format
name. This is done here because parse_enum needs STATE. */
{
const char *fmt_name (unsigned n)
{
return
n >= (sizeof output_fmts / sizeof *output_fmts)
? 0
: output_fmts[n].name;
}
int fmt_index = parse_enum (fmt_string, fmt_name,
"format type", 1, state);
if (fmt_index >= 0)
{
fmt_string = output_fmts[fmt_index].fmt;
if (sort_key_name == NULL)
sort_key_name = output_fmts[fmt_index].sort_key;
}
}
3) We call psout(), which calls ps_fmt_create(), which calls
_fmt_create(). The first argument of _fmt_create, "src", is the long
string I pasted a few lines above. We never leave the
"while (*src != '\0')" loop, because we always end up here, without
having modified src (see libps/fmt.c):
else if (!isalnum (*src) && *src != '_')
/* This field spec doesn't have a name, so use its flags fields
to set the global ones, and skip it. */
{
global_clr_flags = clr_flags;
global_inv_flags = inv_flags;
continue;
}
It seems like the '%' character, which is found in "src", is only
treated in the non-posix code. Plus, since the "%^%pid %th %stat %sl
%pgins %pgflts %cowflts %zfills %sz %rss %cpu %mem %command" string
looks GNU-specific, I think that step 2 should only be done if the Posix
format is not used.
I attached a patch that fixes the issue, but I can't guarantee that it
doesn't break anything. What do you think ?
Regards,
Cyril Roelandt.
fix-ps.patch
Description: Text Data
- [BUG] ps hangs when given "-o user".,
Cyril Roelandt <=