From f6c28b6e0017ac36190ee31132721a1c9e30f2b6 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sat, 22 Nov 2014 00:36:45 -0600 Subject: [PATCH] As long as Android's going to require fortify, fixup the warnings it generates. --- lib/portability.h | 12 ------------ toys/other/acpi.c | 2 +- toys/other/clear.c | 2 +- toys/other/lspci.c | 3 ++- toys/other/nbd_client.c | 2 +- toys/posix/cp.c | 22 +++++++++++++++------- toys/posix/cpio.c | 2 +- toys/posix/find.c | 11 ++++++++--- 8 files changed, 29 insertions(+), 27 deletions(-) diff --git a/lib/portability.h b/lib/portability.h index 2f2421d..d58e592 100644 --- a/lib/portability.h +++ b/lib/portability.h @@ -4,18 +4,6 @@ // in specific compiler, library, or OS versions, localize all that here // and in portability.c -// The tendency of gcc to produce stupid warnings continues with -// warn_unused_result, which warns about things like ignoring the return code -// of nice(2) (which is completely useless since -1 is a legitimate return -// value on success and even the man page tells you to use errno instead). - -// This makes it stop. - -// Except on Android, where fortify is mandatory. -#if !defined(__ANDROID__) -#undef _FORTIFY_SOURCE -#endif - // For musl #define _ALL_SOURCE diff --git a/toys/other/acpi.c b/toys/other/acpi.c index c4f3128..44fd03b 100644 --- a/toys/other/acpi.c +++ b/toys/other/acpi.c @@ -38,7 +38,7 @@ int read_int_at(int dirfd, char *name) FILE *fil; if ((fd = openat(dirfd, name, O_RDONLY)) < 0) return -1; - fscanf(fil = xfdopen(fd, "r"), "%d", &ret); + if (!fscanf(fil = xfdopen(fd, "r"), "%d", &ret)) perror_exit("%s", name); fclose(fil); return ret; diff --git a/toys/other/clear.c b/toys/other/clear.c index 2515f73..4061ea8 100644 --- a/toys/other/clear.c +++ b/toys/other/clear.c @@ -15,5 +15,5 @@ config CLEAR void clear_main(void) { - write(1, "\e[2J\e[H", 7); + xwrite(1, "\e[2J\e[H", 7); } diff --git a/toys/other/lspci.c b/toys/other/lspci.c index 40e0c0a..6a265a1 100644 --- a/toys/other/lspci.c +++ b/toys/other/lspci.c @@ -50,9 +50,10 @@ int do_lspci(struct dirtree *new) if (-1 == (dirfd = openat(dirtree_parentfd(new), new->name, O_RDONLY))) return 0; + // it's ok for the driver link not to be there, whatever fortify says *driver = 0; if (toys.optflags & FLAG_k) - readlinkat(dirfd, "driver", driver, sizeof(driver)); + if (readlinkat(dirfd, "driver", driver, sizeof(driver))); for (fields = (char*[]){"class", "vendor", "device", 0}; *fields; fields++) { int fd, size = 6 + 2*((toys.optflags & FLAG_e) && p == toybuf); diff --git a/toys/other/nbd_client.c b/toys/other/nbd_client.c index 6b437c7..969ad4a 100644 --- a/toys/other/nbd_client.c +++ b/toys/other/nbd_client.c @@ -112,7 +112,7 @@ void nbd_client_main(void) // Daemonize here. - daemon(0,0); + if (daemon(0,0)) perror_exit("daemonize"); // Process NBD requests until further notice. diff --git a/toys/posix/cp.c b/toys/posix/cp.c index 07a8f05..9e83cb8 100644 --- a/toys/posix/cp.c +++ b/toys/posix/cp.c @@ -261,6 +261,7 @@ int cp_node(struct dirtree *try) if (fdout != -1) { if (flags & (FLAG_a|FLAG_p)) { struct timespec times[2]; + int rc; // Inability to set these isn't fatal, some require root access. @@ -268,13 +269,20 @@ int cp_node(struct dirtree *try) times[1] = try->st.st_mtim; // If we can't get a filehandle to the actual object, use racy functions - if (fdout == AT_FDCWD) { - fchownat(cfd, catch, try->st.st_uid, try->st.st_gid, - AT_SYMLINK_NOFOLLOW); - utimensat(cfd, catch, times, AT_SYMLINK_NOFOLLOW); - // permission bits already correct for mknod, don't apply to symlink - } else { - fchown(fdout, try->st.st_uid, try->st.st_gid); + if (fdout == AT_FDCWD) + rc = fchownat(cfd, catch, try->st.st_uid, try->st.st_gid, + AT_SYMLINK_NOFOLLOW); + else rc = fchown(fdout, try->st.st_uid, try->st.st_gid); + if (rc) { + char *pp; + + perror_msg("chown '%s'", pp = dirtree_path(try, 0)); + free(pp); + } + + // permission bits already correct for mknod and don't apply to symlink + if (fdout == AT_FDCWD) utimensat(cfd, catch, times, AT_SYMLINK_NOFOLLOW); + else { futimens(fdout, times); fchmod(fdout, try->st.st_mode); } diff --git a/toys/posix/cpio.c b/toys/posix/cpio.c index 2a0f7d9..312bb93 100644 --- a/toys/posix/cpio.c +++ b/toys/posix/cpio.c @@ -256,7 +256,7 @@ void cpio_main(void) xwrite(afd, toybuf, nlen); } llen = st.st_size & 3; - if (llen) write(afd, &zero, 4-llen); + if (llen) xwrite(afd, &zero, 4-llen); } close(fd); } diff --git a/toys/posix/find.c b/toys/posix/find.c index caec80e..370220e 100644 --- a/toys/posix/find.c +++ b/toys/posix/find.c @@ -72,7 +72,7 @@ static int flush_exec(struct dirtree *new, struct exec_range *aa) { struct double_list **dl; char **newargs; - int rc; + int rc = 0; if (!aa->namecount) return 0; @@ -82,8 +82,13 @@ static int flush_exec(struct dirtree *new, struct exec_range *aa) // switch to directory for -execdir, or back to top if we have an -execdir // _and_ a normal -exec, or are at top of tree in -execdir - if (aa->dir && new->parent) fchdir(new->parent->data); - else if (TT.topdir != -1) fchdir(TT.topdir); + if (aa->dir && new->parent) rc = fchdir(new->parent->data); + else if (TT.topdir != -1) rc = fchdir(TT.topdir); + if (rc) { + perror_msg("%s", new->name); + + return rc; + } // execdir: accumulated execs in this directory's children. newargs = xmalloc(sizeof(char *)*(aa->arglen+aa->namecount+1)); -- 2.7.4