On Thu, Jul 18, 2019 at 4:57 PM Michael Paquier <mich...@paquier.xyz> wrote:

> On Thu, Jul 18, 2019 at 04:17:22PM +0800, Ning Yu wrote:
> > This is still wrong with current code logic, because when the statusdir
> is
> > a file the errno is also EEXIST, but it can pass the check here.  Even if
> > we fix pg_mkdir_p() by following the `mkdir -p` way the errno check here
> is
> > still wrong.
>
> Would you like to send a patch?
>

Michael, we'll send out the patch later. Checked code, it seems that there
is another related mkdir() issue.

MakePGDirectory() is actually a syscall mkdir(), and manpage says the errno
meaning of EEXIST,

       EEXIST pathname already exists (not necessarily as a directory).
This includes the case where pathname is a symbolic link, dangling or not.

However it looks like some callers do not use that correctly, e.g.

      if (MakePGDirectory(directory) < 0)
      {
          if (errno == EEXIST)
              return;

OR

      if (MakePGDirectory(parentdir) < 0 && errno != EEXIST)

i.e. we should better use stat(path) && S_ISDIR(buf) && errno == EEXIST to
replace errno == EEXIST.

One possible fix is to add an argument like ignore_created (in case some
callers want to fail if the path has been created) in MakePGDirectory() and
then add that code logic into it.

Reply via email to