From abbd363261cf3a9b18e611c524f8103fb68f539b Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 8 Nov 2007 17:40:23 +0000 Subject: xreadlink: code shrink udhcp: add missing tryagain member to client_config function old new delta xmalloc_readlink_follow 169 154 -15 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-15) Total: -15 bytes --- libbb/xreadlink.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'libbb/xreadlink.c') diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c index 2f6b1e237..f7948cbf3 100644 --- a/libbb/xreadlink.c +++ b/libbb/xreadlink.c @@ -41,14 +41,21 @@ char *xmalloc_readlink(const char *path) */ char *xmalloc_readlink_follow(const char *path) { - char *buf = NULL, *lpc, *linkpath; + char *buf; + char *lpc; + char *linkpath; int bufsize; - smallint looping = 0; + int looping = MAXSYMLINKS + 1; - buf = strdup(path); - bufsize = strlen(path) + 1; + linkpath = xstrdup(path); + goto jump_in; - while(1) { + while (1) { + if (!--looping) { + free(linkpath); + free(buf); + return NULL; + } linkpath = xmalloc_readlink(buf); if (!linkpath) { if (errno == EINVAL) /* not a symlink */ @@ -56,25 +63,19 @@ char *xmalloc_readlink_follow(const char *path) free(buf); return NULL; } - - if (*linkpath == '/') { - free(buf); - buf = linkpath; - bufsize = strlen(linkpath) + 1; - } else { + if (linkpath[0] != '/') { bufsize += strlen(linkpath); - if (looping++ > MAXSYMLINKS) { - free(linkpath); - free(buf); - return NULL; - } buf = xrealloc(buf, bufsize); lpc = bb_get_last_path_component_strip(buf); strcpy(lpc, linkpath); free(linkpath); + } else { + free(buf); + jump_in: + buf = linkpath; + bufsize = strlen(buf) + 1; } } - } char *xmalloc_readlink_or_warn(const char *path) -- cgit v1.2.3