diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Kbuild | 1 | ||||
-rw-r--r-- | libbb/dump.c | 2 | ||||
-rw-r--r-- | libbb/get_line_from_file.c | 2 | ||||
-rw-r--r-- | libbb/lineedit.c | 7 | ||||
-rw-r--r-- | libbb/mtab.c | 14 | ||||
-rw-r--r-- | libbb/procps.c | 8 | ||||
-rw-r--r-- | libbb/read.c | 49 |
7 files changed, 65 insertions, 18 deletions
diff --git a/libbb/Kbuild b/libbb/Kbuild index 5cbecd5..c49297b 100644 --- a/libbb/Kbuild +++ b/libbb/Kbuild @@ -109,6 +109,7 @@ lib-y += xfunc_die.o lib-y += xgetcwd.o lib-y += xgethostbyname.o lib-y += xreadlink.o +lib-y += xrealloc_vector.o # conditionally compiled objects: lib-$(CONFIG_FEATURE_MOUNT_LOOP) += loop.o diff --git a/libbb/dump.c b/libbb/dump.c index c455952..8a90aac 100644 --- a/libbb/dump.c +++ b/libbb/dump.c @@ -245,7 +245,7 @@ static void rewrite(FS * fs) { savech = *p3; *p3 = '\0'; - pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt)+(p3-p2)+1); + pr->fmt = xrealloc(pr->fmt, strlen(pr->fmt) + (p3-p2) + 1); strcat(pr->fmt, p2); *p3 = savech; p2 = p3; diff --git a/libbb/get_line_from_file.c b/libbb/get_line_from_file.c index 66ea5a1..3a76f49 100644 --- a/libbb/get_line_from_file.c +++ b/libbb/get_line_from_file.c @@ -42,7 +42,7 @@ char* FAST_FUNC bb_get_chunk_from_file(FILE *file, int *end) // free(linebuf); // return NULL; //} - linebuf = xrealloc(linebuf, idx+1); + linebuf = xrealloc(linebuf, idx + 1); linebuf[idx] = '\0'; } return linebuf; diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 3ef47ba..a46b5d2 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -400,11 +400,8 @@ static void free_tab_completion_data(void) static void add_match(char *matched) { - int nm = num_matches; - int nm1 = nm + 1; - - matches = xrealloc(matches, nm1 * sizeof(char *)); - matches[nm] = matched; + matches = xrealloc_vector(matches, 4, num_matches); + matches[num_matches] = matched; num_matches++; } diff --git a/libbb/mtab.c b/libbb/mtab.c index 57654a6..2c17132 100644 --- a/libbb/mtab.c +++ b/libbb/mtab.c @@ -27,14 +27,14 @@ void FAST_FUNC erase_mtab(const char *name) } while ((m = getmntent(mountTable)) != 0) { + entries = xrealloc(entries, 3, count); + entries[count].mnt_fsname = xstrdup(m->mnt_fsname); + entries[count].mnt_dir = xstrdup(m->mnt_dir); + entries[count].mnt_type = xstrdup(m->mnt_type); + entries[count].mnt_opts = xstrdup(m->mnt_opts); + entries[count].mnt_freq = m->mnt_freq; + entries[count].mnt_passno = m->mnt_passno; i = count++; - entries = xrealloc(entries, count * sizeof(entries[0])); - entries[i].mnt_fsname = xstrdup(m->mnt_fsname); - entries[i].mnt_dir = xstrdup(m->mnt_dir); - entries[i].mnt_type = xstrdup(m->mnt_type); - entries[i].mnt_opts = xstrdup(m->mnt_opts); - entries[i].mnt_freq = m->mnt_freq; - entries[i].mnt_passno = m->mnt_passno; } endmntent(mountTable); diff --git a/libbb/procps.c b/libbb/procps.c index 7d49d83..a5168a0 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -45,8 +45,8 @@ static int get_cached(cache_t *cp, unsigned id) for (i = 0; i < cp->size; i++) if (cp->cache[i].id == id) return i; - i = cp->size++; - cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache)); + i = cp->size; + cp->cache = xrealloc_vector(cp->cache, 2, cp->size++); cp->cache[i++].id = id; return -i; } @@ -59,8 +59,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp) for (i = 0; i < cp->size; i++) if (cp->cache[i].id == id) return cp->cache[i].name; - i = cp->size++; - cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache)); + i = cp->size; + cp->cache = xrealloc_vector(cp->cache, 2, cp->size++); cp->cache[i].id = id; /* Never fails. Generates numeric string if name isn't found */ fp(cp->cache[i].name, sizeof(cp->cache[i].name), id); diff --git a/libbb/read.c b/libbb/read.c index 7b80412..405e216 100644 --- a/libbb/read.c +++ b/libbb/read.c @@ -291,3 +291,52 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *sizep) bb_perror_msg_and_die("can't read '%s'", filename); return buf; } + +/* libbb candidate */ +#if 0 +static void *xmalloc_read(int fd, size_t *sizep) +{ + char *buf; + size_t size, rd_size, total; + off_t to_read; + struct stat st; + + to_read = sizep ? *sizep : INT_MAX; /* max to read */ + + /* Estimate file size */ + st.st_size = 0; /* in case fstat fails, assume 0 */ + fstat(fd, &st); + /* /proc/N/stat files report st_size 0 */ + /* In order to make such files readable, we add small const */ + size = (st.st_size | 0x3ff) + 1; + + total = 0; + buf = NULL; + while (1) { + if (to_read < size) + size = to_read; + buf = xrealloc(buf, total + size + 1); + rd_size = full_read(fd, buf + total, size); + if ((ssize_t)rd_size < 0) { /* error */ + free(buf); + return NULL; + } + total += rd_size; + if (rd_size < size) /* EOF */ + break; + to_read -= rd_size; + if (to_read <= 0) + break; + /* grow by 1/8, but in [1k..64k] bounds */ + size = ((total / 8) | 0x3ff) + 1; + if (size > 64*1024) + size = 64*1024; + } + xrealloc(buf, total + 1); + buf[total] = '\0'; + + if (sizep) + *sizep = total; + return buf; +} +#endif |