[MacPorts] #67754: legacysupport implementation of fdopendir closes fd, and this breaks some software

MacPorts noreply at macports.org
Mon Jul 17 13:35:24 UTC 2023


#67754: legacysupport implementation of fdopendir closes fd, and this breaks some
software
----------------------------+--------------------
  Reporter:  kencu          |      Owner:  (none)
      Type:  defect         |     Status:  new
  Priority:  Normal         |  Milestone:
 Component:  ports          |    Version:
Resolution:                 |   Keywords:
      Port:  legacysupport  |
----------------------------+--------------------
Description changed by kencu:

Old description:

> After fdopendir was added to legacysupport, it was noted that there was a
> leak in the function.
>
> So an interested user added a new bit of code to our fdopendir function
> to close the fd.
>
> https://github.com/macports/macports-legacy-
> support/commit/3c9d3c2fc4efb9d1e58e9fb9d44899463391a276
>
> This seemed to meet the implementation spec at the time:
>
> "After a successful call to fdopendir(), fd is used internally by the
> implementation, and should not otherwise be used by the application."
>
> but it turns out that some software still uses "fd" after the call to
> fdopendir. So this software is broken by the fdopendir implementation in
> macports.
>
> see:
>
> https://github.com/macports/macports-ports/pull/19047
>
> This does seem to be in the POSIX spec:
>
> https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopendir.html
>
> "Upon successful return from fdopendir(), the file descriptor is under
> the control of the system, and if any attempt is made to close the file
> descriptor, or to modify the state of the associated description, other
> than by means of closedir(), readdir(), readdir_r(), rewinddir(), or
> seekdir(), the behavior is undefined. Upon calling closedir() the file
> descriptor shall be closed."
>
> So fdopendir may need to be changed to close the fd later, when closedir
> is called.

New description:

 After fdopendir was added to legacysupport, it was noted that there was a
 leak in the function.

 So an interested user added a new bit of code to our fdopendir function to
 close the fd.

 https://github.com/macports/macports-legacy-
 support/commit/3c9d3c2fc4efb9d1e58e9fb9d44899463391a276

 This seemed to meet the implementation spec at the time:

 "After a successful call to fdopendir(), fd is used internally by the
 implementation, and should not otherwise be used by the application."

 but it turns out that some software still uses "fd" after the call to
 fdopendir. So such software is broken by the fdopendir implementation in
 macports.

 see:

 https://github.com/macports/macports-ports/pull/19047

 This does seem to be in the POSIX spec:

 https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdopendir.html

 "Upon successful return from fdopendir(), the file descriptor is under the
 control of the system, and if any attempt is made to close the file
 descriptor, or to modify the state of the associated description, other
 than by means of closedir(), readdir(), readdir_r(), rewinddir(), or
 seekdir(), the behavior is undefined. Upon calling closedir() the file
 descriptor shall be closed."

 So fdopendir may need to be changed to close the fd later, when closedir
 is called.

--

-- 
Ticket URL: <https://trac.macports.org/ticket/67754#comment:2>
MacPorts <https://www.macports.org/>
Ports system for macOS


More information about the macports-tickets mailing list