git: 79679a18eacb - main - fts: Simplify fts_alloc() and use calloc().
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 01 Nov 2024 15:53:17 UTC
The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=79679a18eacbd0f34d24d749ee379e3089045c00 commit 79679a18eacbd0f34d24d749ee379e3089045c00 Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2024-11-01 15:51:56 +0000 Commit: Dag-Erling Smørgrav <des@FreeBSD.org> CommitDate: 2024-11-01 15:53:11 +0000 fts: Simplify fts_alloc() and use calloc(). Sponsored by: Klara, Inc. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D47382 --- lib/libc/gen/fts.c | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/lib/libc/gen/fts.c b/lib/libc/gen/fts.c index 976edacc361e..770a7b2cc322 100644 --- a/lib/libc/gen/fts.c +++ b/lib/libc/gen/fts.c @@ -40,6 +40,7 @@ #include <errno.h> #include <fcntl.h> #include <fts.h> +#include <stdalign.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -1026,44 +1027,32 @@ fts_alloc(FTS *sp, char *name, size_t namelen) FTSENT *p; size_t len; - struct ftsent_withstat { - FTSENT ent; - struct stat statbuf; - }; - /* * The file name is a variable length array and no stat structure is * necessary if the user has set the nostat bit. Allocate the FTSENT * structure, the file name and the stat structure in one chunk, but * be careful that the stat structure is reasonably aligned. */ - if (ISSET(FTS_NOSTAT)) - len = sizeof(FTSENT) + namelen + 1; - else - len = sizeof(struct ftsent_withstat) + namelen + 1; - - if ((p = malloc(len)) == NULL) - return (NULL); - - if (ISSET(FTS_NOSTAT)) { - p->fts_name = (char *)(p + 1); - p->fts_statp = NULL; + len = sizeof(FTSENT) + namelen + 1; + if (!ISSET(FTS_NOSTAT)) { + len = roundup(len, alignof(struct stat)); + p = calloc(1, len + sizeof(struct stat)); } else { - p->fts_name = (char *)((struct ftsent_withstat *)p + 1); - p->fts_statp = &((struct ftsent_withstat *)p)->statbuf; + p = calloc(1, len); } + if (p == NULL) + return (NULL); - /* Copy the name and guarantee NUL termination. */ - memcpy(p->fts_name, name, namelen); - p->fts_name[namelen] = '\0'; - p->fts_namelen = namelen; + p->fts_symfd = -1; p->fts_path = sp->fts_path; - p->fts_errno = 0; - p->fts_flags = 0; + p->fts_name = (char *)(p + 1); + p->fts_namelen = namelen; p->fts_instr = FTS_NOINSTR; - p->fts_number = 0; - p->fts_pointer = NULL; + if (!ISSET(FTS_NOSTAT)) + p->fts_statp = (struct stat *)((char *)p + len); p->fts_fts = sp; + memcpy(p->fts_name, name, namelen); + return (p); }