Check return value from asprintf instead of string != NULL since it

undefined behavior on Linux. From Björn Sandell


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16216 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2005-10-22 13:15:43 +00:00
parent f74a40ff85
commit 9dccedb6d3
3 changed files with 61 additions and 24 deletions

View File

@@ -146,16 +146,16 @@ block_convert(size_t blocks)
#endif
}
static void
static int
make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags)
{
char buf[128];
int file_type = 0;
struct stat *st = &file->st;
file->inode = st->st_ino;
file->bsize = block_convert(st->st_blocks);
if(S_ISDIR(st->st_mode)) {
file->mode[0] = 'd';
file_type = '/';
@@ -218,31 +218,51 @@ make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags)
{
struct passwd *pwd;
pwd = getpwuid(st->st_uid);
if(pwd == NULL)
asprintf(&file->user, "%u", (unsigned)st->st_uid);
else
if(pwd == NULL) {
if (asprintf(&file->user, "%u", (unsigned)st->st_uid) == -1)
file->user = NULL;
} else
file->user = strdup(pwd->pw_name);
if (file->user == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
}
{
struct group *grp;
grp = getgrgid(st->st_gid);
if(grp == NULL)
asprintf(&file->group, "%u", (unsigned)st->st_gid);
else
if(grp == NULL) {
if (asprintf(&file->group, "%u", (unsigned)st->st_gid) == -1)
file->group = NULL;
} else
file->group = strdup(grp->gr_name);
if (file->group == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
}
if(S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
#if defined(major) && defined(minor)
asprintf(&file->major, "%u", (unsigned)major(st->st_rdev));
asprintf(&file->minor, "%u", (unsigned)minor(st->st_rdev));
if (asprintf(&file->major, "%u", (unsigned)major(st->st_rdev)) == -1)
file->major = NULL;
if (asprintf(&file->minor, "%u", (unsigned)minor(st->st_rdev)) == -1)
file->minor = NULL;
#else
/* Don't want to use the DDI/DKI crap. */
asprintf(&file->major, "%u", (unsigned)st->st_rdev);
asprintf(&file->minor, "%u", 0);
if (asprintf(&file->major, "%u", (unsigned)st->st_rdev) == -1)
file->major = NULL;
if (asprintf(&file->minor, "%u", 0) == -1)
file->minor = NULL;
#endif
} else
asprintf(&file->size, "%lu", (unsigned long)st->st_size);
if (file->major == NULL || file->minor == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
} else {
if (asprintf(&file->size, "%lu", (unsigned long)st->st_size) == -1)
file->size = NULL;
}
{
time_t t = time(NULL);
@@ -254,6 +274,10 @@ make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags)
else
strftime(buf, sizeof(buf), "%b %e %H:%M", tm);
file->date = strdup(buf);
if (file->date == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
}
{
const char *p = strrchr(filename, '/');
@@ -261,10 +285,15 @@ make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags)
p++;
else
p = filename;
if((flags & LS_TYPE) && file_type != 0)
asprintf(&file->filename, "%s%c", p, file_type);
else
if((flags & LS_TYPE) && file_type != 0) {
if (asprintf(&file->filename, "%s%c", p, file_type) == -1)
file->filename = NULL;
} else
file->filename = strdup(p);
if (file->filename == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
}
if(S_ISLNK(st->st_mode)) {
int n;
@@ -272,9 +301,14 @@ make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags)
if(n >= 0) {
buf[n] = '\0';
file->link = strdup(buf);
if (file->link == NULL) {
syslog(LOG_ERR, "out of memory");
return -1;
}
} else
sec_fprintf2(out, "readlink(%s): %s", filename, strerror(errno));
}
return 0;
}
static void
@@ -508,7 +542,9 @@ list_files(FILE *out, const char **files, int n_files, int flags)
include_in_list = 0;
}
if(include_in_list) {
make_fileinfo(out, files[i], &fi[i], flags);
ret = make_fileinfo(out, files[i], &fi[i], flags);
if (ret)
goto out;
n_print++;
}
}
@@ -729,6 +765,7 @@ list_dir(FILE *out, const char *directory, int flags)
struct dirent *ent;
char **files = NULL;
int n_files = 0;
int ret;
if(d == NULL) {
syslog(LOG_ERR, "%s: %m", directory);
@@ -747,8 +784,8 @@ list_dir(FILE *out, const char *directory, int flags)
return -1;
}
files = tmp;
asprintf(&files[n_files], "%s/%s", directory, ent->d_name);
if (files[n_files] == NULL) {
ret = asprintf(&files[n_files], "%s/%s", directory, ent->d_name);
if (ret == -1) {
syslog(LOG_ERR, "%s: out of memory", directory);
free_files (files, n_files);
closedir (d);