Message ID | 20220914165827.118893-1-samuel.thibault@ens-lyon.org |
---|---|
State | New |
Headers | show |
Series | [hurd,commited] hurd: Fix readlink() hanging on fifo | expand |
On Sep 14 2022, Samuel Thibault wrote: > diff --git a/sysdeps/mach/hurd/readlink.c b/sysdeps/mach/hurd/readlink.c > index 770462714f..2d75ef7725 100644 > --- a/sysdeps/mach/hurd/readlink.c > +++ b/sysdeps/mach/hurd/readlink.c > @@ -31,7 +31,7 @@ __readlink (const char *file_name, char *buf, size_t len) > file_t file; > struct stat64 st; > > - file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); > + file = __file_name_lookup (file_name, O_NOLINK, 0); > if (file == MACH_PORT_NULL) > return -1; > > @@ -41,6 +41,9 @@ __readlink (const char *file_name, char *buf, size_t len) > { > char *rbuf = buf; > > + __mach_port_deallocate (__mach_task_self (), file); > + file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); How do you know that file_name still points at the same thing?
Andreas Schwab, le mer. 14 sept. 2022 19:04:52 +0200, a ecrit: > On Sep 14 2022, Samuel Thibault wrote: > > diff --git a/sysdeps/mach/hurd/readlink.c b/sysdeps/mach/hurd/readlink.c > > index 770462714f..2d75ef7725 100644 > > --- a/sysdeps/mach/hurd/readlink.c > > +++ b/sysdeps/mach/hurd/readlink.c > > @@ -31,7 +31,7 @@ __readlink (const char *file_name, char *buf, size_t len) > > file_t file; > > struct stat64 st; > > > > - file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); > > + file = __file_name_lookup (file_name, O_NOLINK, 0); > > if (file == MACH_PORT_NULL) > > return -1; > > > > @@ -41,6 +41,9 @@ __readlink (const char *file_name, char *buf, size_t len) > > { > > char *rbuf = buf; > > > > + __mach_port_deallocate (__mach_task_self (), file); > > + file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); > > How do you know that file_name still points at the same thing? Righ, better make that atomic. I have pushed it so. Thanks, Samuel
diff --git a/sysdeps/mach/hurd/readlink.c b/sysdeps/mach/hurd/readlink.c index 770462714f..2d75ef7725 100644 --- a/sysdeps/mach/hurd/readlink.c +++ b/sysdeps/mach/hurd/readlink.c @@ -31,7 +31,7 @@ __readlink (const char *file_name, char *buf, size_t len) file_t file; struct stat64 st; - file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); + file = __file_name_lookup (file_name, O_NOLINK, 0); if (file == MACH_PORT_NULL) return -1; @@ -41,6 +41,9 @@ __readlink (const char *file_name, char *buf, size_t len) { char *rbuf = buf; + __mach_port_deallocate (__mach_task_self (), file); + file = __file_name_lookup (file_name, O_READ | O_NOLINK, 0); + err = __io_read (file, &rbuf, &len, 0, len); if (!err && rbuf != buf) { diff --git a/sysdeps/mach/hurd/readlinkat.c b/sysdeps/mach/hurd/readlinkat.c index 059aad9f58..113b92b732 100644 --- a/sysdeps/mach/hurd/readlinkat.c +++ b/sysdeps/mach/hurd/readlinkat.c @@ -32,7 +32,7 @@ readlinkat (int fd, const char *file_name, char *buf, size_t len) file_t file; struct stat64 st; - file = __file_name_lookup_at (fd, 0, file_name, O_READ | O_NOLINK, 0); + file = __file_name_lookup_at (fd, 0, file_name, O_NOLINK, 0); if (file == MACH_PORT_NULL) return -1; @@ -42,6 +42,9 @@ readlinkat (int fd, const char *file_name, char *buf, size_t len) { char *rbuf = buf; + __mach_port_deallocate (__mach_task_self (), file); + file = __file_name_lookup_at (fd, 0, file_name, O_READ | O_NOLINK, 0); + err = __io_read (file, &rbuf, &len, 0, len); if (!err && rbuf != buf) {