[cs631apue] segfail when using getpwuid

Jan Schaumann jschauma at stevens.edu
Sun Oct 5 21:02:11 EDT 2014


Jin Sun <jsun6 at stevens.edu> wrote:
>  length[OWNER]=max(length[OWNER],(int)strlen(
> 
>             (getpwuid(curr->fts_statp->st_gid))->pw_name));
> 
> 
> anybody know why this line get a segfail?

I'd guess that getpwuid(3) returned NULL, but you're trying to
dereference the result of that function call without checking it first.

Remember what I keep saying every single week about function calls?  If
they _can_ fail under some circumstances, they _will_ fail.

In particular, you appear to be calling getpwuid(3) with gid.  There is
no guarantee that for every gid one can think of there must necessarily
be a password file entry (ie a user account).

You want to:

- add some whitespace to make the whole thing not quite so dense
- call getgrgid(3) instead of getpwuid(3) if you're passing a gid
- check the return result of getgrgid(3) before using it as a valid
  pointer

-Jan


More information about the cs631apue mailing list