git: 210f4d82757b - stable/15 - diff3: prefer posix_spawn over pdfork/execlp
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 06 Apr 2026 16:52:18 UTC
The branch stable/15 has been updated by bapt:
URL: https://cgit.FreeBSD.org/src/commit/?id=210f4d82757b0a0ed273987ee2c2ef69ef23a398
commit 210f4d82757b0a0ed273987ee2c2ef69ef23a398
Author: Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2026-03-25 10:08:58 +0000
Commit: Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2026-04-06 16:51:45 +0000
diff3: prefer posix_spawn over pdfork/execlp
MFC After: 1 week
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D56075
(cherry picked from commit 5f7f0efe8e13247fc80a2a739e757f73a5d7ebda)
---
usr.bin/diff3/diff3.c | 49 ++++++++++++++++++++++++++++++-------------------
1 file changed, 30 insertions(+), 19 deletions(-)
diff --git a/usr.bin/diff3/diff3.c b/usr.bin/diff3/diff3.c
index d85a5da94b10..75e8c6297855 100644
--- a/usr.bin/diff3/diff3.c
+++ b/usr.bin/diff3/diff3.c
@@ -73,14 +73,17 @@
#include <capsicum_helpers.h>
#include <ctype.h>
#include <err.h>
+#include <fcntl.h>
#include <getopt.h>
#include <inttypes.h>
#include <limits.h>
+#include <spawn.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+extern char **environ;
/*
* "from" is first in range of changed lines; "to" is last+1
* from=to=line after point of insertion for added lines.
@@ -301,23 +304,30 @@ readin(int fd, struct diff **dd)
}
static int
-diffexec(const char *diffprog, char **diffargv, int fd[])
+diffexec(char **diffargv, int fd[])
{
- int pd;
-
- switch (pdfork(&pd, PD_CLOEXEC)) {
- case 0:
- close(fd[0]);
- if (dup2(fd[1], STDOUT_FILENO) == -1)
- err(2, "child could not duplicate descriptor");
- close(fd[1]);
- execvp(diffprog, diffargv);
- err(2, "could not execute diff: %s", diffprog);
- break;
- case -1:
- err(2, "could not fork");
- break;
- }
+ posix_spawnattr_t sa;
+ posix_spawn_file_actions_t fa;
+ pid_t pid;
+ int pd, error;
+
+ if ((error = posix_spawnattr_init(&sa)) != 0)
+ errc(2, error, "posix_spawnattr_init");
+ if ((error = posix_spawn_file_actions_init(&fa)) != 0)
+ errc(2, error, "posix_spawn_file_actions_init");
+
+ posix_spawnattr_setprocdescp_np(&sa, &pd, 0);
+
+ posix_spawn_file_actions_addclose(&fa, fd[0]);
+ posix_spawn_file_actions_adddup2(&fa, fd[1], STDOUT_FILENO);
+ posix_spawn_file_actions_addclose(&fa, fd[1]);
+
+ error = posix_spawn(&pid, diffargv[0], &fa, &sa, diffargv, environ);
+ if (error != 0)
+ errc(2, error, "could not spawn diff");
+
+ posix_spawn_file_actions_destroy(&fa);
+ posix_spawnattr_destroy(&sa);
close(fd[1]);
return (pd);
}
@@ -1004,7 +1014,7 @@ main(int argc, char **argv)
eflag = EFLAG_OVERLAP;
break;
case DIFFPROG_OPT:
- diffprog = optarg;
+ diffargv[0] = optarg;
break;
case STRIPCR_OPT:
strip_cr = 1;
@@ -1079,13 +1089,14 @@ main(int argc, char **argv)
if (pipe(fd23))
err(2, "pipe");
+
diffargv[diffargc] = file1;
diffargv[diffargc + 1] = file3;
diffargv[diffargc + 2] = NULL;
- pd13 = diffexec(diffprog, diffargv, fd13);
+ pd13 = diffexec(diffargv, fd13);
diffargv[diffargc] = file2;
- pd23 = diffexec(diffprog, diffargv, fd23);
+ pd23 = diffexec(diffargv, fd23);
caph_cache_catpages();
if (caph_enter() < 0)