diff options
author | Andreas Gruenbacher <agruen@gnu.org> | 2015-10-03 15:18:58 +0200 |
---|---|---|
committer | Andreas Gruenbacher <agruen@gnu.org> | 2015-10-03 15:25:49 +0200 |
commit | 3270d221a961680af1c5d0005bfded0b9eb691a7 (patch) | |
tree | b9154e78579ee043e542c75a0d1db958c9abe4f2 | |
parent | 98b86e970a3bc9c893a5d8344dd4f46070f1d236 (diff) | |
download | patch-3270d221a961680af1c5d0005bfded0b9eb691a7.tar.gz |
Don't use a zero-size array in struct symlink
* src/safe.c (struct symlink): Get rid of the zero-size array which is a gcc
extension.
(read_symlink): Adapt to this struct symlink change.
-rw-r--r-- | src/safe.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -261,7 +261,6 @@ static unsigned int count_path_components (const char *path) struct symlink { struct symlink *prev; const char *path; - char buffer[0]; }; static void push_symlink (struct symlink **stack, struct symlink *symlink) @@ -285,6 +284,7 @@ static struct symlink *read_symlink(int dirfd, const char *name) int saved_errno = errno; struct stat st; struct symlink *symlink; + char *buffer; ssize_t ret; if (fstatat (dirfd, name, &st, AT_SYMLINK_NOFOLLOW) @@ -294,12 +294,13 @@ static struct symlink *read_symlink(int dirfd, const char *name) return NULL; } symlink = xmalloc (sizeof (*symlink) + st.st_size + 1); - ret = readlinkat (dirfd, name, symlink->buffer, st.st_size); + buffer = (char *)(symlink + 1); + ret = readlinkat (dirfd, name, buffer, st.st_size); if (ret <= 0) goto fail; - symlink->buffer[ret] = 0; - symlink->path = symlink->buffer; - if (ISSLASH (*symlink->path)) + buffer[ret] = 0; + symlink->path = buffer; + if (ISSLASH (*buffer)) { char *end; @@ -309,7 +310,7 @@ static struct symlink *read_symlink(int dirfd, const char *name) if (cwd_stat_errno) goto fail_exdev; } - end = symlink->buffer + ret; + end = buffer + ret; for (;;) { char slash; |