Public bug reported:

The whole pidfile_xxx suite, besides being unnecessarily complicated
compared to 1 function in NetBSD, does not do what it says on the tin.

Complications.  4 functions instead of one.  pidfile_open requires
pidptr, but doesn't use it.  The other functions require an argument
that the documentation says isn't needed, but is.

Error. Most important, pidfile_close modifies its argument such that
pidfile_remove can't use it: both the file descriptor and the name are
destroyed.

The following program and associated output illustrates the problem.

#include <err.h>
#include <stdio.h>
#include <stdlib.h>

#include <bsd/libutil.h>

void
show_pfh( const char func[], struct pidfh * pfh ) {
  printf( "%s: fh = %d, name = %s\n", func, pfh->pf_fd, pfh->pf_path );
}

int
main(int argc, char *argv[])
{
  pid_t pid;
  
  struct pidfh * pfh = pidfile_open("/tmp/foo.pid", 0644, &pid);

  if( !pfh ) {
    err(EXIT_FAILURE, "pidfile_open");
  }
  show_pfh("open", pfh);
  
  if( -1 == pidfile_write(pfh) ) {
    err(EXIT_FAILURE, "pidfile_write");
  }
  show_pfh("write", pfh);

  if( -1 == pidfile_close(pfh) ) {
    err(EXIT_FAILURE, "pidfile_close");
  }
  show_pfh("close", pfh);

  if( -1 == pidfile_remove(pfh) ) {
    err(EXIT_FAILURE, "pidfile_remove");
  }
  show_pfh("remove", pfh);

  return 0;
}                                        
  
$ ./pid
open: fh = 3, name = /tmp/foo.pid
write: fh = 3, name = /tmp/foo.pid
close: fh = 0, name = 
pid: pidfile_remove: Invalid argument

$ grep -iE 'name|version' /etc/os-release 
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
UBUNTU_CODENAME=xenial

$ gcc --version | grep ^gcc
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609

$ ldd pid
        linux-vdso.so.1 =>  (0x00007fffc79b6000)
        libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f72ee343000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72edf79000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f72ee558000)

** Affects: libbsd (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to libbsd in Ubuntu.
https://bugs.launchpad.net/bugs/1836219

Title:
  pidfile_close prevents pidfile_remove from working

Status in libbsd package in Ubuntu:
  New

Bug description:
  The whole pidfile_xxx suite, besides being unnecessarily complicated
  compared to 1 function in NetBSD, does not do what it says on the tin.

  Complications.  4 functions instead of one.  pidfile_open requires
  pidptr, but doesn't use it.  The other functions require an argument
  that the documentation says isn't needed, but is.

  Error. Most important, pidfile_close modifies its argument such that
  pidfile_remove can't use it: both the file descriptor and the name are
  destroyed.

  The following program and associated output illustrates the problem.

  #include <err.h>
  #include <stdio.h>
  #include <stdlib.h>

  #include <bsd/libutil.h>

  void
  show_pfh( const char func[], struct pidfh * pfh ) {
    printf( "%s: fh = %d, name = %s\n", func, pfh->pf_fd, pfh->pf_path );
  }

  int
  main(int argc, char *argv[])
  {
    pid_t pid;
    
    struct pidfh * pfh = pidfile_open("/tmp/foo.pid", 0644, &pid);

    if( !pfh ) {
      err(EXIT_FAILURE, "pidfile_open");
    }
    show_pfh("open", pfh);
    
    if( -1 == pidfile_write(pfh) ) {
      err(EXIT_FAILURE, "pidfile_write");
    }
    show_pfh("write", pfh);

    if( -1 == pidfile_close(pfh) ) {
      err(EXIT_FAILURE, "pidfile_close");
    }
    show_pfh("close", pfh);

    if( -1 == pidfile_remove(pfh) ) {
      err(EXIT_FAILURE, "pidfile_remove");
    }
    show_pfh("remove", pfh);

    return 0;
  }                                        
    
  $ ./pid
  open: fh = 3, name = /tmp/foo.pid
  write: fh = 3, name = /tmp/foo.pid
  close: fh = 0, name = 
  pid: pidfile_remove: Invalid argument

  $ grep -iE 'name|version' /etc/os-release 
  NAME="Ubuntu"
  VERSION="16.04 LTS (Xenial Xerus)"
  PRETTY_NAME="Ubuntu 16.04 LTS"
  VERSION_ID="16.04"
  UBUNTU_CODENAME=xenial

  $ gcc --version | grep ^gcc
  gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609

  $ ldd pid
          linux-vdso.so.1 =>  (0x00007fffc79b6000)
          libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f72ee343000)
          libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72edf79000)
          /lib64/ld-linux-x86-64.so.2 (0x00007f72ee558000)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libbsd/+bug/1836219/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to