diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2020-09-18 16:48:53 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2020-09-18 16:48:53 -0400 |
commit | 0aa71f890777d2aaddeca53384b94742e4b2678b (patch) | |
tree | df44e7c577d733b4d219fe2d8d18ce139c92e2bd /util.c | |
parent | 72cfcb1fa636017611ce0aeddbe2970003a01cfa (diff) | |
download | bfs-0aa71f890777d2aaddeca53384b94742e4b2678b.tar.xz |
util: Make the initial allocation bigger for xreadlinkat()
Most symlinks are more than 1 character long, so rather than wasting
time with 1, 2, 4, ... when we don't have a good guess for the length,
start with a bigger one.
Credit to https://twitter.com/RichFelker/status/1306321019108556806 for
reminding me of this.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -59,10 +59,15 @@ int xreaddir(DIR *dir, struct dirent **de) { } char *xreadlinkat(int fd, const char *path, size_t size) { - ++size; // NUL-terminator ssize_t len; char *name = NULL; + if (size == 0) { + size = 64; + } else { + ++size; // NUL terminator + } + while (true) { char *new_name = realloc(name, size); if (!new_name) { |