Message ID | 20181031013815.4089-1-casantos@datacom.com.br |
---|---|
State | Superseded, archived |
Headers | show |
Series | uclibc: fix mkostemp | expand |
Hi Carlos, On Tue, Oct 30, 2018 at 10:38:15PM -0300, Carlos Santos wrote: > Pull a patch already submitted upstream[1] that fixes mkostemp when > _LARGEFILE64_SOURCE is defined. This is required to prevent failures > on eudev: > > # udevadm hwdb --update > Failure writing database //etc/udev/hwdb.bin: Invalid argument You forgot your upstream submission reference: [1] https://mailman.uclibc-ng.org/pipermail/devel/2018-October/thread.html baruch > Signed-off-by: Carlos Santos <casantos@datacom.com.br> > --- > Test: > > $ cat test.c > #include <errno.h> > #include <fcntl.h> > #include <stdio.h> > #include <stdlib.h> > #include <string.h> > #include <sys/types.h> > #include <sys/stat.h> > > void fatal(int n) > { > fprintf(stderr, "fatal[%d]: %s\n", n, strerror(errno)); > exit(1); > } > > int main(int argc, char *argv[]) > { > FILE *f; > int cur_mode; > char template[64]; > strncpy(template, argc > 1 ? argv[1] : "testXXXXXX", 63); > > umask(077); > printf("main[1]: %s, %07o\n", template, O_WRONLY|O_CLOEXEC); > int fd = mkostemp(template, O_WRONLY|O_CLOEXEC); > if (fd < 0) { > fatal(1); > } > cur_mode = fcntl(fd, F_GETFL); > printf("main[2]: %s, %07o\n", template, cur_mode); > > printf("main[3]: %d, %s\n", fd, "we"); > f = fdopen(fd, "we"); > if (!f) { > fatal(2); > } > > if (fclose(f) == EOF) { > fatal(3); > } > > return 0; > } > > $ x86_64-buildroot-linux-uclibc-cc -Wall -Werror -D_GNU_SOURCE \ > -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ > -o mkostemp-test-large test.c > > [ copy executables to target device (qemu, in this case) ] > > # mkostemp-test-large > main[1]: testXXXXXX, 2000001 > main[2]: testiXRydb, 0100003 > main[3]: 3, we > fatal[2]: Invalid argument > --- > ...stemp64-clear-flags-as-mkostemp-does.patch | 38 +++++++++++++++++++ > 1 file changed, 38 insertions(+) > create mode 100644 package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch > > diff --git a/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch b/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch > new file mode 100644 > index 0000000000..992d660214 > --- /dev/null > +++ b/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch > @@ -0,0 +1,38 @@ > +From 8810ead09006e7f0d7d342303120d74440774421 Mon Sep 17 00:00:00 2001 > +From: Carlos Santos <casantos@datacom.com.br> > +Date: Mon, 29 Oct 2018 01:17:38 -0300 > +Subject: [PATCH] mkostemp64: clear flags, as mkostemp does > + > +This should have been made in commit 9649721950 but was forgotten. > + > +Signed-off-by: Carlos Santos <casantos@datacom.com.br> > +--- > + libc/stdlib/mkostemp64.c | 3 ++- > + 1 file changed, 2 insertions(+), 1 deletion(-) > + > +diff --git a/libc/stdlib/mkostemp64.c b/libc/stdlib/mkostemp64.c > +index aa9736cd6..f4674bb0c 100644 > +--- a/libc/stdlib/mkostemp64.c > ++++ b/libc/stdlib/mkostemp64.c > +@@ -15,9 +15,9 @@ > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +-#include <fcntl.h> > + #include <stdio.h> > + #include <stdlib.h> > ++#include <fcntl.h> > + #include "../misc/internals/tempname.h" > + > + /* Generate a unique temporary file name from TEMPLATE. > +@@ -27,6 +27,7 @@ > + int > + mkostemp64 (char *template, int flags) > + { > ++ flags -= flags & O_ACCMODE; /* Remove O_RDONLY, O_WRONLY, and O_RDWR. */ > + return __gen_tempname (template, __GT_BIGFILE, flags | O_LARGEFILE, 0, > + S_IRUSR | S_IWUSR); > + }
diff --git a/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch b/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch new file mode 100644 index 0000000000..992d660214 --- /dev/null +++ b/package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch @@ -0,0 +1,38 @@ +From 8810ead09006e7f0d7d342303120d74440774421 Mon Sep 17 00:00:00 2001 +From: Carlos Santos <casantos@datacom.com.br> +Date: Mon, 29 Oct 2018 01:17:38 -0300 +Subject: [PATCH] mkostemp64: clear flags, as mkostemp does + +This should have been made in commit 9649721950 but was forgotten. + +Signed-off-by: Carlos Santos <casantos@datacom.com.br> +--- + libc/stdlib/mkostemp64.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/libc/stdlib/mkostemp64.c b/libc/stdlib/mkostemp64.c +index aa9736cd6..f4674bb0c 100644 +--- a/libc/stdlib/mkostemp64.c ++++ b/libc/stdlib/mkostemp64.c +@@ -15,9 +15,9 @@ + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +-#include <fcntl.h> + #include <stdio.h> + #include <stdlib.h> ++#include <fcntl.h> + #include "../misc/internals/tempname.h" + + /* Generate a unique temporary file name from TEMPLATE. +@@ -27,6 +27,7 @@ + int + mkostemp64 (char *template, int flags) + { ++ flags -= flags & O_ACCMODE; /* Remove O_RDONLY, O_WRONLY, and O_RDWR. */ + return __gen_tempname (template, __GT_BIGFILE, flags | O_LARGEFILE, 0, + S_IRUSR | S_IWUSR); + } +-- +2.17.1 +
Pull a patch already submitted upstream[1] that fixes mkostemp when _LARGEFILE64_SOURCE is defined. This is required to prevent failures on eudev: # udevadm hwdb --update Failure writing database //etc/udev/hwdb.bin: Invalid argument Signed-off-by: Carlos Santos <casantos@datacom.com.br> --- Test: $ cat test.c #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> void fatal(int n) { fprintf(stderr, "fatal[%d]: %s\n", n, strerror(errno)); exit(1); } int main(int argc, char *argv[]) { FILE *f; int cur_mode; char template[64]; strncpy(template, argc > 1 ? argv[1] : "testXXXXXX", 63); umask(077); printf("main[1]: %s, %07o\n", template, O_WRONLY|O_CLOEXEC); int fd = mkostemp(template, O_WRONLY|O_CLOEXEC); if (fd < 0) { fatal(1); } cur_mode = fcntl(fd, F_GETFL); printf("main[2]: %s, %07o\n", template, cur_mode); printf("main[3]: %d, %s\n", fd, "we"); f = fdopen(fd, "we"); if (!f) { fatal(2); } if (fclose(f) == EOF) { fatal(3); } return 0; } $ x86_64-buildroot-linux-uclibc-cc -Wall -Werror -D_GNU_SOURCE \ -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -o mkostemp-test-large test.c [ copy executables to target device (qemu, in this case) ] # mkostemp-test-large main[1]: testXXXXXX, 2000001 main[2]: testiXRydb, 0100003 main[3]: 3, we fatal[2]: Invalid argument --- ...stemp64-clear-flags-as-mkostemp-does.patch | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 package/uclibc/0004-mkostemp64-clear-flags-as-mkostemp-does.patch