small fixes:
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 26 Nov 2006 15:45:17 +0000 (15:45 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 26 Nov 2006 15:45:17 +0000 (15:45 -0000)
fix xstrdup to not grossly overallocate memory
use xopen instean of xopen3 in several places
etc.

archival/tar.c
coreutils/dd.c
libbb/xfuncs.c
miscutils/crontab.c
miscutils/rx.c
networking/ftpgetput.c
networking/wget.c
runit/svlogd.c
util-linux/mdev.c

index 48a1c34cd2bce16ec80fc56de7d3789b7712b883..be3df687edf320dff10ff0951b4db8595ab148d2 100644 (file)
@@ -851,7 +851,7 @@ int tar_main(int argc, char **argv)
                        tar_handle->src_fd = fileno(tar_stream);
                        tar_handle->seek = seek_by_read;
                } else {
-                       tar_handle->src_fd = xopen3(tar_filename, flags, 0666);
+                       tar_handle->src_fd = xopen(tar_filename, flags);
                }
        }
 
index 01702a58092aee56cd9d198f9ba152ca05272ff2..01f37abeb56d9fdbe3e3724c3be4ec1e5c812adf 100644 (file)
@@ -138,7 +138,7 @@ int dd_main(int argc, char **argv)
                if (!seek && (flags & trunc_flag))
                        oflag |= O_TRUNC;
 
-               ofd = xopen3(outfile, oflag, 0666);
+               ofd = xopen(outfile, oflag);
 
                if (seek && (flags & trunc_flag)) {
                        if (ftruncate(ofd, seek * obs) < 0) {
index 773e718b873dc94f7db5409411bc6845359fdbab..ade639516a1dc48f8769822778b282e396d0236e 100644 (file)
@@ -57,7 +57,7 @@ char * xstrdup(const char *s)
        if (s == NULL)
                return NULL;
 
-       t = strdup (s);
+       t = strdup(s);
 
        if (t == NULL)
                bb_error_msg_and_die(bb_msg_memory_exhausted);
@@ -69,23 +69,33 @@ char * xstrdup(const char *s)
 // the (possibly truncated to length n) string into it.
 char * xstrndup(const char *s, int n)
 {
+       int m;
        char *t;
 
        if (ENABLE_DEBUG && s == NULL)
                bb_error_msg_and_die("xstrndup bug");
 
-       /* TODO: think about xstrndup("abc", 10000)!!! */
-       t = xmalloc(++n);
+       /* We can just xmalloc(n+1) and strncpy into it, */
+       /* but think about xstrndup("abc", 10000) wastage! */
+       m = n;
+       t = (char*) s;
+       while (m) {
+               if (!*t) break;
+               m--; t++;
+       }
+       n = n - m;
+       t = xmalloc(n + 1);
+       t[n] = '\0';
 
-       return safe_strncpy(t,s,n);
+       return memcpy(t,s,n);
 }
 
 // Die if we can't open a file and return a FILE * to it.
 // Notice we haven't got xfread(), This is for use with fscanf() and friends.
 FILE *xfopen(const char *path, const char *mode)
 {
-       FILE *fp;
-       if ((fp = fopen(path, mode)) == NULL)
+       FILE *fp = fopen(path, mode);
+       if (fp == NULL)
                bb_perror_msg_and_die("%s", path);
        return fp;
 }
@@ -93,8 +103,8 @@ FILE *xfopen(const char *path, const char *mode)
 // Die if we can't open an existing file and return an fd.
 int xopen(const char *pathname, int flags)
 {
-       if (ENABLE_DEBUG && (flags & O_CREAT))
-               bb_error_msg_and_die("xopen() with O_CREAT");
+       //if (ENABLE_DEBUG && (flags & O_CREAT))
+       //      bb_error_msg_and_die("xopen() with O_CREAT");
 
        return xopen3(pathname, flags, 0666);
 }
@@ -142,7 +152,7 @@ off_t xlseek(int fd, off_t offset, int whence)
        return off;
 }
 
-// Die with supplied error message if this FILE * has ferror set.
+// Die with supplied filename if this FILE * has ferror set.
 void die_if_ferror(FILE *fp, const char *fn)
 {
        if (ferror(fp)) {
@@ -214,7 +224,6 @@ void xsetenv(const char *key, const char *value)
                bb_error_msg_and_die(bb_msg_memory_exhausted);
 }
 
-
 // Converts unsigned long long value into compact 4-char
 // representation. Examples: "1234", "1.2k", " 27M", "123T"
 // Fifth char is always '\0'
@@ -257,7 +266,6 @@ void smart_ulltoa5(unsigned long long ul, char buf[5])
        buf[4] = '\0';
 }
 
-
 // Convert unsigned integer to ascii, writing into supplied buffer.  A
 // truncated result is always null terminated (unless buflen is 0), and
 // contains the first few digits of the result ala strncpy.
index 743ac74ae9c0eeb86ff63a0998e75f436cb194e1..39d3aae4184e5999a3943e9682ed37db9f75e00d 100644 (file)
@@ -156,6 +156,7 @@ int crontab_main(int ac, char **av)
                break;
        case EDIT:
                {
+/* FIXME: messy code here! we have file copying helpers for this! */
                        FILE *fi;
                        int fd;
                        int n;
@@ -163,11 +164,12 @@ int crontab_main(int ac, char **av)
 
                        snprintf(tmp, sizeof(tmp), TMPDIR "/crontab.%d", getpid());
                        fd = xopen3(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600);
+/* race, use fchown */
                        chown(tmp, getuid(), getgid());
                        fi = fopen(pas->pw_name, "r");
                        if (fi) {
                                while ((n = fread(buf, 1, sizeof(buf), fi)) > 0)
-                                       write(fd, buf, n);
+                                       full_write(fd, buf, n);
                        }
                        EditFile(caller, tmp);
                        remove(tmp);
@@ -178,6 +180,7 @@ int crontab_main(int ac, char **av)
                /* fall through */
        case REPLACE:
                {
+/* same here */
                        char path[1024];
                        int fd;
                        int n;
@@ -186,7 +189,7 @@ int crontab_main(int ac, char **av)
                        fd = open(path, O_CREAT|O_TRUNC|O_APPEND|O_WRONLY, 0600);
                        if (fd >= 0) {
                                while ((n = read(repFd, buf, sizeof(buf))) > 0) {
-                                       write(fd, buf, n);
+                                       full_write(fd, buf, n);
                                }
                                close(fd);
                                rename(path, pas->pw_name);
index f723c167601b83ea29d7ba273e1663f5f584f486..9b9f6afd485e8bca751611672e7d05846a28e11b 100644 (file)
@@ -263,7 +263,7 @@ int rx_main(int argc, char **argv)
 
        fn = argv[1];
        ttyfd = xopen(CURRENT_TTY, O_RDWR);
-       filefd = xopen3(fn, O_RDWR|O_CREAT|O_TRUNC, 0666);
+       filefd = xopen(fn, O_RDWR|O_CREAT|O_TRUNC);
 
        if (tcgetattr(ttyfd, &tty) < 0)
                        bb_perror_msg_and_die("tcgetattr");
index a842401c0ca73a832f4f6431669c9bde90d811d3..fa18549038b8dba35b94c09fa885ef5320ac2542 100644 (file)
@@ -166,7 +166,7 @@ int ftp_receive(ftp_host_info_t *server, FILE *control_stream,
                if (do_continue) {
                        fd_local = xopen(local_path, O_APPEND | O_WRONLY);
                } else {
-                       fd_local = xopen3(local_path, O_CREAT | O_TRUNC | O_WRONLY, 0666);
+                       fd_local = xopen(local_path, O_CREAT | O_TRUNC | O_WRONLY);
                }
        }
 
index 5a547ce1fdf450da8b26b7767b6c545c610c2364..1e51ce96b304ed0cba6f15868bbf1ed214f5ef5c 100644 (file)
@@ -452,8 +452,8 @@ int wget_main(int argc, char **argv)
 
        /* Do it before progressmeter (want to have nice error message) */
        if (output_fd < 0)
-               output_fd = xopen3(fname_out,
-                       O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0666);
+               output_fd = xopen(fname_out,
+                       O_WRONLY|O_CREAT|O_EXCL|O_TRUNC);
 
        if (!(opt & WGET_OPT_QUIET))
                progressmeter(-1);
index b2fbe51675973c883bab8b3ee3b28cc04fe355c2..7024c3db49ac957fb4b8134a70d53b8ddd35f611 100644 (file)
@@ -148,19 +148,19 @@ static unsigned processorstart(struct logdir *ld)
                if (fd_move(0, fd) == -1)
                        bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
                ld->fnsave[26] = 't';
-               fd = xopen3(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT, 0644);
+               fd = xopen(ld->fnsave, O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
                if (fd_move(1, fd) == -1)
                        bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
                fd = open_read("state");
                if (fd == -1) {
                        if (errno != ENOENT)
                                bb_perror_msg_and_die(FATAL"cannot %s processor %s", "open state for", ld->name);
-                       close(xopen3("state", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT, 0644));
+                       close(xopen("state", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT));
                        fd = xopen("state", O_RDONLY|O_NDELAY);
                }
                if (fd_move(4, fd) == -1)
                        bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
-               fd = xopen3("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT, 0644);
+               fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
                if (fd_move(5, fd) == -1)
                        bb_perror_msg_and_die(FATAL"cannot %s processor %s", "move filedescriptor for", ld->name);
 
index c03dd61308f822fbe175acfbade92e6478c7df6d..957316d52660ca5e2121dbb77acc086a3abd4c92 100644 (file)
@@ -73,7 +73,7 @@ static void make_device(char *path, int delete)
 
                        line++;
                        /* find end of this line */
-                       for(end=pos; end-conf<len && *end!='\n'; end++)
+                       for (end=pos; end-conf<len && *end!='\n'; end++)
                                ;
 
                        /* Three fields: regex, uid:gid, mode */
@@ -111,7 +111,7 @@ static void make_device(char *path, int delete)
                                        char *s, *s2;
 
                                        /* Find : */
-                                       for(s=pos; s<end2 && *s!=':'; s++)
+                                       for (s=pos; s<end2 && *s!=':'; s++)
                                                ;
                                        if (s == end2) break;