Description of problem:
lslogins segfault when execute with buggy user name.
Version-Release number of selected component (if applicable):
Steps to Reproduce:
1.Execute lslogins with buggy user name
lslogins abort due to scols_line_get_cell: Assertion `ln' failed and it is failed because user does not exist.
It should not segfault
After checked the lslogins code it seems get_user_info is returned NULL if user does not exist and initially errno is 0
static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const char *username)
struct lslogins_user *user;
struct passwd *pwd;
struct group *grp;
struct spwd *shadow;
struct utmp *user_wtmp = NULL, *user_btmp = NULL;
int n = 0;
errno = 0;
pwd = username ? getpwnam(username) : getpwent();
In function get_user to validate about error it is doing logical and with errno but if errno is 0 in that case the code path will not execute even user is NULL so it will return 0,It should check if user is NULL then should return -1.
static int get_user(struct lslogins_control *ctl, struct lslogins_user **user,const char *username)
*user = get_user_info(ctl, username);
if (!*user && errno)
I think after update above condition it will execute successfully.
Fixed by upstream commit 123f0f5bf00635e5dd7e5cbc73f906bf2a0bed9c.
It would be probably nice to rebase all lslogins.c with the current upstream. There is many another bugfixes.
Does this also affect RHEL 6? Should this be cloned?
(In reply to Terry Bowling from comment #15)
> Does this also affect RHEL 6? Should this be cloned?
The most fatal issues should be already fixed in RHEL6.8 (see bug #1215840), the last missing things for RHEL6 are nonsenses in --help output.
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory, and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.