From 25cfe4996ec967e19283f6b66c45cf220a615528 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 20 Apr 2008 01:27:59 +0000 Subject: libbb: prevent xmalloc_open_read_close from dying on seek failure start_stop_daemon: use open_read_close instead of xmalloc_open_read_close start_stop_daemon: use local structure instead of global one function old new delta check 1620 1661 +41 xmalloc_open_read_close 171 190 +19 start_stop_daemon_main 976 954 -22 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/1 up/down: 60/-22) Total: 38 bytes --- libbb/read.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'libbb/read.c') diff --git a/libbb/read.c b/libbb/read.c index ba366cb97..e5f140f3b 100644 --- a/libbb/read.c +++ b/libbb/read.c @@ -208,25 +208,34 @@ ssize_t open_read_close(const char *filename, void *buf, size_t size) void *xmalloc_open_read_close(const char *filename, size_t *sizep) { char *buf; - size_t size = sizep ? *sizep : INT_MAX; + size_t size; int fd; off_t len; fd = open(filename, O_RDONLY); if (fd < 0) return NULL; + /* /proc/N/stat files report len 0 here */ /* In order to make such files readable, we add small const */ - len = xlseek(fd, 0, SEEK_END) | 0x3ff; /* + up to 1k */ - xlseek(fd, 0, SEEK_SET); - if (len < size) - size = len; + size = 0x3ff; /* read only 1k on unseekable files */ + len = lseek(fd, 0, SEEK_END) | 0x3ff; /* + up to 1k */ + if (len != (off_t)-1) { + xlseek(fd, 0, SEEK_SET); + size = sizep ? *sizep : INT_MAX; + if (len < size) + size = len; + } + buf = xmalloc(size + 1); size = read_close(fd, buf, size); - if ((ssize_t)size < 0) - bb_perror_msg_and_die("'%s'", filename); + if ((ssize_t)size < 0) { + free(buf); + return NULL; + } xrealloc(buf, size + 1); buf[size] = '\0'; + if (sizep) *sizep = size; return buf; -- cgit v1.2.3