NetBSD Problem Report #58809

From martin@aprisoft.de  Sun Nov  3 17:48:32 2024
Return-Path: <martin@aprisoft.de>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
	 client-signature RSA-PSS (2048 bits) client-digest SHA256)
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id F19D51A9238
	for <gnats-bugs@gnats.NetBSD.org>; Sun,  3 Nov 2024 17:48:31 +0000 (UTC)
Message-Id: <20241103174818.1D1E55CC7B9@emmas.aprisoft.de>
Date: Sun,  3 Nov 2024 18:48:18 +0100 (CET)
From: martin@aprisoft.de
Reply-To: martin@aprisoft.de
To: gnats-bugs@NetBSD.org
Subject: stat(2) fails for freshly created directory
X-Send-Pr-Version: 3.95

>Number:         58809
>Category:       bin
>Synopsis:       pkg_add -P gets confused
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    bin-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Nov 03 17:50:01 +0000 2024
>Last-Modified:  Mon Jan 13 11:20:01 +0000 2025
>Originator:     Martin Husemann
>Release:        NetBSD 10.99.12
>Organization:
The NetBSD Foundation, Inc.
>Environment:
System: NetBSD martins.aprisoft.de 10.99.12 NetBSD 10.99.12 (GENERIC) #250: Sat Nov 2 11:23:49 CET 2024 martin@martins.aprisoft.de:/home/martin/current/src/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:

I am trying to run a script that populates a directory with pkg stuff.
I get strange failures from pkg-add -P ...

pkg_add: var_set: can't open temp file for 'root//usr/pkg/pkgdb/libcbor-0.11.0/+INSTALLED_INFO' for writing: No such file or directory

This fails in lib/var.c::var_set in mkstemp() because the stat testing
for the existance of the target directory fails. This is strange, because
pkg_add created it a few seconds before and it is still there after
the failure (and no unlink calls for it in ktrace output).

  8742   8742 pkg_add  CALL  mkdir(0x782bc5837f80,0x1ff)
  8742   8742 pkg_add  NAMI  "root//usr/pkg/pkgdb/libcbor-0.11.0"
  8742   8742 pkg_add  RET   mkdir 0
[..]
  8742   8742 pkg_add  CALL  __stat50(0x782bc5834500,0x7f7fff7510f0)
  8742   8742 pkg_add  NAMI  "root//usr/pkg/pkgdb/libcbor-0.11.0"
  8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory

 > ls -l root//usr/pkg/pkgdb/libcbor-0.11.0
total 28
-r--r--r--  1 root  users  2732 Nov  3 18:29 +BUILD_INFO
-r--r--r--  1 root  users   444 Nov  3 18:29 +BUILD_VERSION
-r--r--r--  1 root  users    52 Nov  3 18:29 +COMMENT
-rw-r--r--  1 root  users  2355 Nov  3 18:29 +CONTENTS
-r--r--r--  1 root  users   440 Nov  3 18:29 +DESC
-r--r--r--  1 root  users     7 Nov  3 18:29 +SIZE_ALL
-r--r--r--  1 root  users     7 Nov  3 18:29 +SIZE_PKG


This is on ffs  (FFSv2):
	/dev/dk6 on / type ffs (local)

I am pretty sure I used a very simmilar invocation of pkg_add -P a few
days ago against an empty pkgdb and it worked. Only thing (AFAICT) I changed
is updated kernel + userland today.

>How-To-Repeat:

cd /tmp && mkdir root && pkg_add -P root ${pkgs}/fidocrypt-0.0nb20241023.tgz

(not sure what exactly are the relevant things to reproduce)

>Fix:
n/a

>Release-Note:

>Audit-Trail:

Responsible-Changed-From-To: kern-bug-people->bin-bug-people
Responsible-Changed-By: martin@NetBSD.org
Responsible-Changed-When: Sun, 03 Nov 2024 18:02:38 +0000
Responsible-Changed-Why:
not a kernel issue


From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Sun, 3 Nov 2024 19:02:46 +0100

 Looking closer and grepping the right patterns in the ktrace output
 shows this is a plain pkg_add bug (thanks bad@ !).

   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x9000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff7513e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff751980)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x9000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc59bb060,0x7f7fff751b00)
   8742   8742 pkg_add  NAMI  "/usr/pkg/pkgdb"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  __stat50(0x782bc59bb060,0x7f7fff751b00)
   8742   8742 pkg_add  NAMI  "/usr/pkg/pkgdb"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  __stat50(0x782bc59bb060,0x7f7fff751b00)
   8742   8742 pkg_add  NAMI  "/usr/pkg/pkgdb"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x3000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff74f260)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff74f260)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(3,0x7f7fff74e1b0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff74eb98)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff74dff0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff74dff0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,3,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(3,0x7f7fff751720)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x11000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff7514e0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(4,0x782bc59ae340,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff7514d0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(4,0x782bc59ae340,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f250)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f250)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff74e1a0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74eb88)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74dfe0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74dfe0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff750d00,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff750ce0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff750cb0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f0b0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f0b0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff74e000,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74e9e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74de40)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74de40)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff750a90,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f0b0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74f0b0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(4,0x7f7fff74e000,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(4,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74e9e8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74de40)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff74de40)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,4,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(4,0x7f7fff7516f0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(4,0x782bc5892a10,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff751330)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x9000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff751320)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(5,0x782bc5878f00,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74f0a0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74f0a0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff74dff0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74e9d8)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74de30)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74de30)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff750b50,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff750b30,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff750b00,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74ef00)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74ef00)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff74de50,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74e838)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74dc90)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74dc90)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff7508e0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74ef00)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74ef00)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(5,0x7f7fff74de50,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(5,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74e838)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74dc90)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff74dc90)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,5,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(5,0x7f7fff751540)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(5,0x782bc5828d10,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff751180)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x9000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff751170)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(6,0x782bc580ea00,0x8000)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff74eef0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,6,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff74eef0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x4b,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,6,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(6,0x7f7fff74de40,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(6,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff74e828)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x1000,PROT_READ,0x1<SHARED,FILE,ALIGN=NONE>,6,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff74dc80)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x7300,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,6,0,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff74dc80)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x32c0,PROT_READ,0x2<PRIVATE,FILE,ALIGN=NONE>,6,0,0)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(6,0x7f7fff7509a0,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(6,0,0,1)
 --
   8742   8742 pkg_add  CALL  __fstatvfs190(6,0x7f7fff750980,2)
   8742   8742 pkg_add  RET   __fstatvfs190 0
   8742   8742 pkg_add  CALL  lseek(6,0,0,1)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc580d5a0,0x7f7fff751670)
   8742   8742 pkg_add  NAMI  "/usr/lib/libc.so.12"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc5837f80,0x1ff)
   8742   8742 pkg_add  NAMI  "root//usr/pkg/pkgdb/libcbor-0.11.0"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  unlink(0x782bc5837fe0)
 --
   8742   8742 pkg_add  CALL  mkdir(0x782bc58c32d0,0x1ff)
   8742   8742 pkg_add  NAMI  "root//usr/pkg"
   8742   8742 pkg_add  RET   mkdir -1 errno 17 File exists
   8742   8742 pkg_add  CALL  __stat50(0x782bc58c32d0,0x7f7fff7511c0)
   8742   8742 pkg_add  NAMI  "root//usr/pkg"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  open(0x782bc5837fe0,0x400202,0x1a4)
 --
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff751170)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  __fstat50(6,0x7f7fff751040)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x5000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  chdir(0x782bc58c32d0)
   8742   8742 pkg_add  NAMI  "root//usr/pkg"
   8742   8742 pkg_add  RET   chdir 0
   8742   8742 pkg_add  CALL  __gettimeofday50(0x7f7fff751250,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(1,0x7f7fff750740)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  ioctl(1,TIOCGETA,0x7f7fff7507b0)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5835ea0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "include"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  mkdir(0x782bc5835ea0,0x1ed)
   8742   8742 pkg_add  NAMI  "include"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  open(0x782bc5835ea0,0x400a01,0x1a4)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5c78c9a,0x7f7fff750d50)
   8742   8742 pkg_add  NAMI  "/etc/nsswitch.conf"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  open(0x782bc5c78c9a,0x400000,0x1b6)
 --
   8742   8742 pkg_add  CALL  __fstat50(8,0x7f7fff750a80)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  mmap(0,0x9000,PROT_READ|PROT_WRITE,0x1002<PRIVATE,ANONYMOUS,ALIGN=NONE>,0xffffffff,0,0)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5c783eb,0x7f7fff7501a0)
   8742   8742 pkg_add  NAMI  "/etc/spwd.db"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  open(0x782bc5c783eb,0x400000,0)
 --
   8742   8742 pkg_add  CALL  __fstat50(8,0x7f7fff7501a0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(8,0x782bc58dd300,0x104)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5c78c9a,0x7f7fff750d80)
   8742   8742 pkg_add  NAMI  "/etc/nsswitch.conf"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  open(0x782bc5c785d0,0x400000,0x1b6)
 --
   8742   8742 pkg_add  CALL  __fstat50(8,0x7f7fff7506f0)
   8742   8742 pkg_add  RET   __fstat50 0
   8742   8742 pkg_add  CALL  read(8,0x782bc57e3780,0x8000)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5835ea0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "include/cbor"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  __stat50(0x782bc5835ea0,0x7f7fff751060)
   8742   8742 pkg_add  NAMI  "include"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc5835ea0,0x1ed)
   8742   8742 pkg_add  NAMI  "include/cbor"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  open(0x782bc5835ea0,0x400a01,0x1a4)
 --
 	IFIER\n\n#endif\n\nstatic const uint8_t cbor_major_version = CBOR_MAJO\
 	R_VERSION;\nstatic const uint8_t cbor_minor_version = CBOR_MINOR_VERSI\
 	ON;\nstatic const uint8_t cbor_patch_version = CBOR_PATCH_VERSION;\n\n\
 	#define CBOR_VERSION               \\\n  _CBOR_TO_STR(CBOR_MAJOR_VERSI\
 --
        "is function modifies the global state and should therefore be\n *  use\
 	d accordingly. Changing the memory handlers while allocated items exis\
 --
 	ming decoder result - status */\nenum cbor_decoder_status {\n  /** Dec\
 	oding finished successfully (a callback has been invoked)\n   *\n   * \
 --
 	ad`).\n   *\n   * Set to 0 if the #status is not #CBOR_DECODER_FINISHE\
 	D.\n   */\n  size_t read;\n\n  /** The decoding status */\n  enum cbor\
 	_decoder_status status;\n\n  /** Number of bytes in the input buffer n\
 	eeded to resume parsing\n   *\n   * Set to 0 unless the result status \
 	is #CBOR_DECODER_NEDATA. If it is, then:\n   *  - If at least one byte\
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "include/cbor/internal"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751060)
   8742   8742 pkg_add  NAMI  "include/cbor"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc58347c0,0x1ed)
   8742   8742 pkg_add  NAMI  "include/cbor/internal"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  open(0x782bc58347c0,0x400a01,0x1a4)
 --
 	m _cbor_unicode_status_error { _CBOR_UNICODE_OK, _CBOR_UNICODE_BADCP }\
 	;\n\n/** Signals unicode validation error and possibly its location */\
 	\nstruct _cbor_unicode_status {\n  enum _cbor_unicode_status_error sta\
 	tus;\n  size_t location;\n};\n\n_CBOR_NODISCARD\nsize_t _cbor_unicode_\
 --
 	                        struct _cbor_unicode_status* status);\n\n#ifde\
 	f __cplusplus\n}\n#endif\n\n#endif  // LIBCBOR_UNICODE_H\n"
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "lib/cmake/libcbor"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751060)
   8742   8742 pkg_add  NAMI  "lib/cmake"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff750f80)
   8742   8742 pkg_add  NAMI  "lib"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  mkdir(0x782bc58347c0,0x1ed)
   8742   8742 pkg_add  NAMI  "lib"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc58347c0,0x1ed)
   8742   8742 pkg_add  NAMI  "lib/cmake"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc58347c0,0x1ed)
   8742   8742 pkg_add  NAMI  "lib/cmake/libcbor"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  open(0x782bc58347c0,0x400a01,0x1a4)
 --
   8742   8742 pkg_add  CALL  __lstat50(0x782bc58347c0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "lib/libcbor.so"
   8742   8742 pkg_add  RET   __lstat50 0
   8742   8742 pkg_add  CALL  write(1,0x782bc5982000,0xf)
 --
   8742   8742 pkg_add  CALL  __lstat50(0x782bc58347c0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "lib/libcbor.so.0.11"
   8742   8742 pkg_add  RET   __lstat50 0
   8742   8742 pkg_add  CALL  write(1,0x782bc5982000,0x14)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751140)
   8742   8742 pkg_add  NAMI  "lib/pkgconfig"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  __stat50(0x782bc58347c0,0x7f7fff751060)
   8742   8742 pkg_add  NAMI  "lib"
   8742   8742 pkg_add  RET   __stat50 0
   8742   8742 pkg_add  CALL  mkdir(0x782bc58347c0,0x1ed)
   8742   8742 pkg_add  NAMI  "lib/pkgconfig"
   8742   8742 pkg_add  RET   mkdir 0
   8742   8742 pkg_add  CALL  open(0x782bc58347c0,0x400a01,0x1a4)
 --
   8742   8742 pkg_add  CALL  __stat50(0x782bc5834500,0x7f7fff7510f0)
   8742   8742 pkg_add  NAMI  "root//usr/pkg/pkgdb/libcbor-0.11.0"
   8742   8742 pkg_add  RET   __stat50 -1 errno 2 No such file or directory
   8742   8742 pkg_add  CALL  write(2,0x7f7fff750f90,9)


 So it chdirs to root/usr/pkg to extract the libcbor stuff, never chdirs
 back and then fails to access pkgdb files.

 Jörg mentioned this could have been fixed upstream recently.

 Martin

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Mon, 4 Nov 2024 19:36:48 +0100

 On Sun, Nov 03, 2024 at 07:02:46PM +0100, Martin Husemann wrote:
 > Jörg mentioned this could have been fixed upstream recently.

 I checked with latest tools from pkgsrc and the failure is the same.

 Martin

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Tue, 5 Nov 2024 09:39:47 +0100

 Applying the patch below to pkgsrc and copying over the pkgsrc version
 to external/bsd/pkg_install/dist fixes this for me.

 Martin


 Save and restore current working directory around chdir() and
 pkg extraction.

 Index: perform.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/add/perform.c,v
 retrieving revision 1.126
 diff -u -r1.126 perform.c
 --- perform.c	1 Nov 2024 11:26:46 -0000	1.126
 +++ perform.c	5 Nov 2024 06:24:22 -0000
 @@ -692,7 +692,7 @@
  	int r;
  	plist_t *p;
  	const char *last_file;
 -	char *fullpath;
 +	char *fullpath, orig_cwd[PATH_MAX];

  	if (Fake)
  		return 0;
 @@ -707,6 +707,11 @@
  		return -1;
  	}

 +	if (getcwd(orig_cwd, sizeof(orig_cwd)) == NULL) {
 +		warn("Can't get current working directory");
 +		return -1;
 +	}
 +
  	if (chdir(pkg->install_prefix) == -1) {
  		warn("Can't change into prefix: %s", pkg->install_prefix);
  		return -1;
 @@ -833,6 +838,8 @@
  		pkgdb_close();
  	archive_write_free(writer);

 +	chdir(orig_cwd);
 +
  	return r;
  }


From: RVP <rvp@SDF.ORG>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Tue, 5 Nov 2024 20:32:15 +0000 (UTC)

 > +      if (getcwd(orig_cwd, sizeof(orig_cwd)) == NULL) {
 > +              warn("Can't get current working directory");
 > +              return -1;
 > +      }
 > +
 > [...]
 > +      chdir(orig_cwd);
 > +
 >

 Save a buffer by doing:

 ```
 fd = open(".", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
 ...
 fchdir(fd);
 ```

 ?

 (precedent in pfcexec():pkg_install/dist/lib/fexec.c)

 -RVP

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Thu, 28 Nov 2024 18:22:38 +0100

 This patch also works for me. While checking for other getcwd() calls
 I found one where the result was unused and eliminate that.

 After this patch there is only a single getcwd() call left (in lib/pkg_io.c::
 process_pkg_path) and that plays with the path results instead of a simple
 push/pop of the current working dir, so I left it alone.

 I plan to commit this soonish unless there are objections.

 Martin

 --8<--
 extract_files(): save and restore current directory.
 make_dist(): remove an unused getcwd().
 Fixes PR bin/58809.


 Index: files/add/perform.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/add/perform.c,v
 retrieving revision 1.126
 diff -u -p -r1.126 perform.c
 --- files/add/perform.c	1 Nov 2024 11:26:46 -0000	1.126
 +++ files/add/perform.c	28 Nov 2024 17:17:03 -0000
 @@ -693,6 +693,7 @@ extract_files(struct pkg_task *pkg)
  	plist_t *p;
  	const char *last_file;
  	char *fullpath;
 +	int workdir;

  	if (Fake)
  		return 0;
 @@ -707,6 +708,12 @@ extract_files(struct pkg_task *pkg)
  		return -1;
  	}

 +	workdir = open(".", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
 +	if (workdir == -1) {
 +		warn("Can't open current working directory");
 +		return -1;
 +	}
 +
  	if (chdir(pkg->install_prefix) == -1) {
  		warn("Can't change into prefix: %s", pkg->install_prefix);
  		return -1;
 @@ -833,6 +840,8 @@ out:
  		pkgdb_close();
  	archive_write_free(writer);

 +	fchdir(workdir);
 +
  	return r;
  }

 Index: files/create/build.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/create/build.c,v
 retrieving revision 1.17
 diff -u -p -r1.17 build.c
 --- files/create/build.c	19 Apr 2017 21:42:50 -0000	1.17
 +++ files/create/build.c	28 Nov 2024 17:17:03 -0000
 @@ -229,7 +229,6 @@ make_dist(const char *pkg, const char *s
  	struct archive *archive;
  	struct archive_entry *entry, *sparse_entry;
  	struct archive_entry_linkresolver *resolver;
 -	char *initial_cwd;

  	archive = archive_write_new();
  	archive_write_set_format_pax_restricted(archive);
 @@ -291,8 +290,6 @@ make_dist(const char *pkg, const char *s
  	if (Preserve)
  		write_meta_file(preserve_file, archive);

 -	initial_cwd = getcwd(NULL, 0);
 -
  	for (p = plist->head; p; p = p->next) {
  		if (p->type == PLIST_FILE) {
  			write_normal_file(p->name, archive, resolver, owner, group);
 @@ -325,8 +322,6 @@ make_dist(const char *pkg, const char *s

  	if (archive_write_free(archive))
  		errx(2, "cannot finish archive: %s", archive_error_string(archive));
 -
 -	free(initial_cwd);
  }

  static struct memory_file *

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/58809 CVS commit: pkgsrc/pkgtools/pkg_install/files/add
Date: Sat, 7 Dec 2024 13:20:14 +0000

 Module Name:	pkgsrc
 Committed By:	martin
 Date:		Sat Dec  7 13:20:14 UTC 2024

 Modified Files:
 	pkgsrc/pkgtools/pkg_install/files/add: perform.c

 Log Message:
 PR 58809: save and restore current working directory when installing
 libraries.


 To generate a diff of this commit:
 cvs rdiff -u -r1.126 -r1.127 pkgsrc/pkgtools/pkg_install/files/add/perform.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

Responsible-Changed-From-To: bin-bug-people->pkg-manager
Responsible-Changed-By: martin@NetBSD.org
Responsible-Changed-When: Sat, 07 Dec 2024 18:52:33 +0000
Responsible-Changed-Why:
This requires a fix in pkgsrc first and then an import of the fixed
version into base.
Fix is known (but details controversial).


From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Fri, 27 Dec 2024 18:25:26 +0100

 Here is a better patch.

 Martin

 Index: perform.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/add/perform.c,v
 retrieving revision 1.128
 diff -u -p -r1.128 perform.c
 --- perform.c	7 Dec 2024 13:56:46 -0000	1.128
 +++ perform.c	27 Dec 2024 17:22:29 -0000
 @@ -693,6 +693,13 @@ extract_files(struct pkg_task *pkg)
  	plist_t *p;
  	const char *last_file;
  	char *fullpath;
 +#ifdef O_DIRECTORY
 +	int workdir;
 +#define	NO_WORK_DIR	-1
 +#else
 +	char *workdir;
 +#define	NO_WORK_DIR	NULL
 +#endif

  	if (Fake)
  		return 0;
 @@ -707,6 +714,16 @@ extract_files(struct pkg_task *pkg)
  		return -1;
  	}

 +#ifdef O_DIRECTORY
 +	workdir = open(".", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
 +#else
 +	workdir = getcwd(NULL, 0);
 +#endif
 +	if (workdir == NO_WORK_DIR) {
 +		warn("Can't open current working directory");
 +		return -1;
 +	}
 +
  	if (chdir(pkg->install_prefix) == -1) {
  		warn("Can't change into prefix: %s", pkg->install_prefix);
  		return -1;
 @@ -833,6 +850,14 @@ out:
  		pkgdb_close();
  	archive_write_free(writer);

 +#ifdef O_DIRECTORY
 +	fchdir(workdir);
 +	close(workdir);
 +#else
 +	chdir(workdir);
 +	free(workdir);
 +#endif
 +
  	return r;
  }


From: =?UTF-8?Q?J=C3=B6rg_Sonnenberger?= <joerg@bec.de>
To: gnats-bugs@netbsd.org, pkg-manager@netbsd.org, gnats-admin@netbsd.org,
 pkgsrc-bugs@netbsd.org, martin@aprisoft.de
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Mon, 30 Dec 2024 22:08:58 +0100

 On 12/27/24 6:30 PM, Martin Husemann via gnats wrote:
 > The following reply was made to PR pkg/58809; it has been noted by GNATS.
 > 
 > From: Martin Husemann <martin@duskware.de>
 > To: gnats-bugs@netbsd.org
 > Cc:
 > Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
 > Date: Fri, 27 Dec 2024 18:25:26 +0100
 > 
 >   Here is a better patch.

 There is no reason to depend on O_DIRECTORY. "." is always a directory, 
 so it's a no-op on systems that implement it.

 Joerg

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/58809: pkg_add gets confused with -P and library installs
Date: Thu, 2 Jan 2025 20:46:56 +0100

 Like this?

 Martin

 Index: perform.c
 ===================================================================
 RCS file: /cvsroot/pkgsrc/pkgtools/pkg_install/files/add/perform.c,v
 retrieving revision 1.128
 diff -u -p -r1.128 perform.c
 --- perform.c	7 Dec 2024 13:56:46 -0000	1.128
 +++ perform.c	2 Jan 2025 19:43:18 -0000
 @@ -693,6 +693,7 @@ extract_files(struct pkg_task *pkg)
  	plist_t *p;
  	const char *last_file;
  	char *fullpath;
 +	int workdir;

  	if (Fake)
  		return 0;
 @@ -707,6 +708,15 @@ extract_files(struct pkg_task *pkg)
  		return -1;
  	}

 +#ifndef O_DIRECTORY
 +#define	O_DIRECTORY	0
 +#endif
 +	workdir = open(".", O_RDONLY|O_CLOEXEC|O_DIRECTORY);
 +	if (workdir == -1) {
 +		warn("Can't open current working directory");
 +		return -1;
 +	}
 +
  	if (chdir(pkg->install_prefix) == -1) {
  		warn("Can't change into prefix: %s", pkg->install_prefix);
  		return -1;
 @@ -833,6 +843,9 @@ out:
  		pkgdb_close();
  	archive_write_free(writer);

 +	fchdir(workdir);
 +	close(workdir);
 +
  	return r;
  }


Responsible-Changed-From-To: pkg-manager->bin-bug-people
Responsible-Changed-By: martin@NetBSD.org
Responsible-Changed-When: Mon, 13 Jan 2025 11:17:55 +0000
Responsible-Changed-Why:
This is fixed upstream in pkgsrc, we only need to import a newer pkg_*
version into base.


From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/58809 CVS commit: pkgsrc/pkgtools/pkg_install/files/add
Date: Mon, 13 Jan 2025 11:16:20 +0000

 Module Name:	pkgsrc
 Committed By:	martin
 Date:		Mon Jan 13 11:16:19 UTC 2025

 Modified Files:
 	pkgsrc/pkgtools/pkg_install/files/add: perform.c

 Log Message:
 PR 58809: save current directory before adding pkgs and restore
 it afterwards.


 To generate a diff of this commit:
 cvs rdiff -u -r1.128 -r1.129 pkgsrc/pkgtools/pkg_install/files/add/perform.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2025 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.