New upstream version 4.15.2
This commit is contained in:
+48
-31
@@ -37,6 +37,7 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc.h"
|
||||
#include "atoi/str2i.h"
|
||||
#include "chkname.h"
|
||||
#include "defines.h"
|
||||
#include "faillog.h"
|
||||
@@ -237,6 +238,9 @@ static void create_home (void);
|
||||
static void create_mail (void);
|
||||
static void check_uid_range(int rflg, uid_t user_id);
|
||||
|
||||
static FILE *fmkstemp(char *template);
|
||||
|
||||
|
||||
/*
|
||||
* fail_exit - undo as much as possible
|
||||
*/
|
||||
@@ -415,7 +419,7 @@ static void get_defaults (void)
|
||||
* Default Password Inactive value
|
||||
*/
|
||||
else if (MATCH (buf, DINACT)) {
|
||||
if ( (getlong(ccp, &def_inactive) == -1)
|
||||
if ( (str2sl(&def_inactive, ccp) == -1)
|
||||
|| (def_inactive < -1)) {
|
||||
fprintf (stderr,
|
||||
_("%s: invalid numeric argument '%s'\n"),
|
||||
@@ -523,7 +527,6 @@ static void show_defaults (void)
|
||||
*/
|
||||
static int set_defaults (void)
|
||||
{
|
||||
int ofd;
|
||||
int ret = -1;
|
||||
bool out_group = false;
|
||||
bool out_groups = false;
|
||||
@@ -557,7 +560,7 @@ static int set_defaults (void)
|
||||
fprintf(stderr,
|
||||
_("%s: cannot create new defaults file: %s\n"),
|
||||
Prog, strerror(errno));
|
||||
goto setdef_err;
|
||||
goto err_free_new;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -566,36 +569,27 @@ static int set_defaults (void)
|
||||
fprintf (stderr,
|
||||
_("%s: cannot create directory for defaults file\n"),
|
||||
Prog);
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
|
||||
ret = mkdir(dirname(new_file_dup), 0755);
|
||||
free(new_file_dup);
|
||||
if (-1 == ret && EEXIST != errno) {
|
||||
fprintf (stderr,
|
||||
_("%s: cannot create directory for defaults file\n"),
|
||||
Prog);
|
||||
free(new_file_dup);
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
free(new_file_dup);
|
||||
|
||||
/*
|
||||
* Create a temporary file to copy the new output to.
|
||||
*/
|
||||
ofd = mkstemp (new_file);
|
||||
if (-1 == ofd) {
|
||||
fprintf (stderr,
|
||||
_("%s: cannot create new defaults file\n"),
|
||||
Prog);
|
||||
goto setdef_err;
|
||||
}
|
||||
|
||||
ofp = fdopen (ofd, "w");
|
||||
ofp = fmkstemp(new_file);
|
||||
if (NULL == ofp) {
|
||||
fprintf (stderr,
|
||||
_("%s: cannot open new defaults file\n"),
|
||||
Prog);
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -621,8 +615,9 @@ static int set_defaults (void)
|
||||
fprintf (stderr,
|
||||
_("%s: line too long in %s: %s..."),
|
||||
Prog, default_file, buf);
|
||||
(void) fclose (ifp);
|
||||
goto setdef_err;
|
||||
fclose(ifp);
|
||||
fclose(ofp);
|
||||
goto err_free_def;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -701,9 +696,10 @@ static int set_defaults (void)
|
||||
(void) fflush (ofp);
|
||||
if ( (ferror (ofp) != 0)
|
||||
|| (fsync (fileno (ofp)) != 0)
|
||||
|| (fclose (ofp) != 0)) {
|
||||
|| (fclose (ofp) != 0))
|
||||
{
|
||||
unlink (new_file);
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -717,7 +713,7 @@ static int set_defaults (void)
|
||||
_("%s: Cannot create backup file (%s): %s\n"),
|
||||
Prog, buf, strerror (err));
|
||||
unlink (new_file);
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -728,7 +724,7 @@ static int set_defaults (void)
|
||||
fprintf (stderr,
|
||||
_("%s: rename: %s: %s\n"),
|
||||
Prog, new_file, strerror (err));
|
||||
goto setdef_err;
|
||||
goto err_free_def;
|
||||
}
|
||||
#ifdef WITH_AUDIT
|
||||
audit_logger (AUDIT_USYS_CONFIG, Prog,
|
||||
@@ -743,11 +739,12 @@ static int set_defaults (void)
|
||||
def_inactive, def_expire, def_template,
|
||||
def_create_mail_spool, def_log_init));
|
||||
ret = 0;
|
||||
setdef_err:
|
||||
free(new_file);
|
||||
if (prefix[0]) {
|
||||
|
||||
err_free_def:
|
||||
if (prefix[0])
|
||||
free(default_file);
|
||||
}
|
||||
err_free_new:
|
||||
free(new_file);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -856,14 +853,14 @@ static int get_groups (char *list)
|
||||
*/
|
||||
static struct group * get_local_group(char * grp_name)
|
||||
{
|
||||
char *end;
|
||||
const struct group *grp;
|
||||
struct group *result_grp = NULL;
|
||||
long long gid;
|
||||
char *endptr;
|
||||
|
||||
gid = strtoll (grp_name, &endptr, 10);
|
||||
gid = strtoll(grp_name, &end, 10);
|
||||
if ( ('\0' != *grp_name)
|
||||
&& ('\0' == *endptr)
|
||||
&& ('\0' == *end)
|
||||
&& (ERANGE != errno)
|
||||
&& (gid == (gid_t)gid)) {
|
||||
grp = gr_locate_gid (gid);
|
||||
@@ -1301,7 +1298,7 @@ static void process_flags (int argc, char **argv)
|
||||
eflg = true;
|
||||
break;
|
||||
case 'f':
|
||||
if ( (getlong(optarg, &def_inactive) == -1)
|
||||
if ( (str2sl(&def_inactive, optarg) == -1)
|
||||
|| (def_inactive < -1)) {
|
||||
fprintf (stderr,
|
||||
_("%s: invalid numeric argument '%s'\n"),
|
||||
@@ -2750,3 +2747,23 @@ int main (int argc, char **argv)
|
||||
return E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static FILE *
|
||||
fmkstemp(char *template)
|
||||
{
|
||||
int fd;
|
||||
FILE *fp;
|
||||
|
||||
fd = mkstemp(template);
|
||||
if (fd == -1)
|
||||
return NULL;
|
||||
|
||||
fp = fdopen(fd, "w");
|
||||
if (fp == NULL) {
|
||||
close(fd);
|
||||
unlink(template);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fp;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user