[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Z/OS Enhancement to gnu lib
From: |
Bruno Haible |
Subject: |
Re: Z/OS Enhancement to gnu lib |
Date: |
Mon, 30 Jan 2023 23:12:04 +0100 |
Igor Todorovski wrote:
> This was the symptom we experienced with findutils (guarding the close in
> gnulib fixed it):
> find . -name "test"
> The output is:
> find: '.': EDC5113I Bad file descriptor.
>
> https://github.com/ZOSOpenTools/findutilsport/issues/4
>
> We’ll do some more testing to see if there’s a better solution.
I'm sending you a testdir, generated through
./gnulib-tool --create-testdir --dir=/tmp/testdir --single-configure \
areadlinkat areadlinkat-with-size faccessat fchmodat fchownat
fdopendir getcwd fstatat linkat mkdirat mkfifoat openat
readlinkat renameatu savedir symlinkat unlinkat utimensat
As part of your testing, please run it through
./configure && make && make check
(Sent via private mail, as it's too large for this mailing list.)
> __e2a_l is documented here:
> https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-e2a-l-convert-characters-from-ebcdic-ascii
Well, according to this documentation your patch was buggy: it did not
check the return value. Additionally, it ran a conversion on a buffer
full of uninitialized data (which is 1. slow and 2. triggers warnings
in tools like valgrind). And when w_ioctl failed, your code was
accessing and returning unitialized data in dir[]. Ouch ouch ouch.
Fixing it like this:
2023-01-30 Bruno Haible <bruno@clisp.org>
at-internal: Fix support for z/OS.
* lib/openat-proc.c (openat_proc_name) [z/OS]: Proper error handling.
Convert only the relevant part of the dir[] buffer.
diff --git a/lib/openat-proc.c b/lib/openat-proc.c
index 6419a8cf5f..88f70be4f5 100644
--- a/lib/openat-proc.c
+++ b/lib/openat-proc.c
@@ -123,8 +123,16 @@ openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd,
char const *file)
# endif
# ifdef __MVS__
char dir[_XOPEN_PATH_MAX];
- if (w_ioctl (fd, _IOCC_GPN, sizeof dir, dir) == 0)
- __e2a_l (dir, sizeof dir);
+ /* Documentation:
+
https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-w-ioctl-w-pioctl-control-devices
*/
+ if (w_ioctl (fd, _IOCC_GPN, sizeof dir, dir) < 0)
+ return NULL;
+ /* Documentation:
+
https://www.ibm.com/docs/en/zos/2.2.0?topic=functions-e2a-l-convert-characters-from-ebcdic-ascii
*/
+ dirlen = __e2a_l (dir, strlen (dir));
+ if (dirlen < 0 || dirlen >= sizeof dir)
+ return NULL;
+ dir[dirlen] = '\0';
# endif
dirlen = strlen (dir);