installboot(8) runs newfs(8) and fsck(8) via system(3) but only checks
failures of the function itself, always returning zero no matter what the
programs/shell returned.
This is bad for regress tests relying on correct return codes.
create_filesystem() itself must not exit as write_filesystem() calls it and
cleans up temporary files upon failure.
Make it return -1 if the script returned non-zero so write_filesystem()
handles it as error, cleans up and makes installboot exit 1.
Stop ignoring create_filesystem()'s return code in md_prepareboot() and
exit the same way.
Here's the change in behaviour on arm64 (newfs fails because of the
vnd/disklabel race, see "Race in disk_attach_callback?" on tech@):
# installboot -vp vnd0 ; echo $?
newfsing
6694ae5b0d7596ed.i
newfs_msdos: /dev/r6694ae5b0d7596ed.i: No such file or directory
0
# ./obj/installboot -vp vnd0 ; echo $?
newfsing
6694ae5b0d7596ed.i
newfs_msdos: /dev/r6694ae5b0d7596ed.i: No such file or directory
1
Tested on amd64 arm64 macppc octeon powerpc64 sparc64
OK millert
-/* $OpenBSD: efi_installboot.c,v 1.4 2022/09/07 10:21:03 kn Exp $ */
+/* $OpenBSD: efi_installboot.c,v 1.5 2022/09/09 15:53:16 kn Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <err.h>
#include <errno.h>
warnx("disklabel type unknown");
part = findgptefisys(devfd, &dl);
+ if (part == -1)
+ part = findmbrfat(devfd, &dl);
if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
- }
-
- part = findmbrfat(devfd, &dl);
- if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
+ if (create_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
return rslt;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt))
+ return -1;
}
return 0;
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_MSDOS, dst, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = create_filesystem(dl, part);
-/* $OpenBSD: i386_installboot.c,v 1.41 2022/08/31 20:52:15 krw Exp $ */
+/* $OpenBSD: i386_installboot.c,v 1.42 2022/09/09 15:53:16 kn Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <sys/time.h>
+#include <sys/wait.h>
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
part = findgptefisys(devfd, &dl);
if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
+ if (create_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
return rslt;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt))
+ return -1;
}
return 0;
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_MSDOS, dst, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = create_filesystem(dl, part);
-/* $OpenBSD: loongson_installboot.c,v 1.4 2021/07/20 14:51:56 kettenis Exp $ */
+/* $OpenBSD: loongson_installboot.c,v 1.5 2022/09/09 15:53:16 kn Exp $ */
/* $NetBSD: installboot.c,v 1.5 1995/11/17 23:23:50 gwr Exp $ */
/*
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <err.h>
#include <errno.h>
part = findmbrfat(devfd, &dl);
if (part != -1) {
- write_filesystem(&dl, (char)part);
- return;
+ if (write_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_EXT2FS, dst, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = snprintf(cmd, sizeof(cmd), newfsfmt,
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
rslt = mount(MOUNT_EXT2FS, dst, 0, &args);
if (rslt == -1) {
warn("unable to mount ext2fs partition");
-/* $OpenBSD: macppc_installboot.c,v 1.6 2022/09/03 15:46:20 kn Exp $ */
+/* $OpenBSD: macppc_installboot.c,v 1.7 2022/09/09 15:53:16 kn Exp $ */
/*
* Copyright (c) 2011 Joel Sing <jsing@openbsd.org>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <err.h>
#include <errno.h>
part = findmbrfat(devfd, &dl);
if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
+ if (create_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
return rslt;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt))
+ return -1;
}
return 0;
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_MSDOS, dst, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = create_filesystem(dl, part);
-/* $OpenBSD: octeon_installboot.c,v 1.5 2022/08/31 20:52:15 krw Exp $ */
+/* $OpenBSD: octeon_installboot.c,v 1.6 2022/09/09 15:53:16 kn Exp $ */
/*
* Copyright (c) 2011 Joel Sing <jsing@openbsd.org>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <err.h>
#include <errno.h>
part = findmbrfat(devfd, &dl);
if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
+ if (create_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
return rslt;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt))
+ return -1;
}
return 0;
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_MSDOS, dst, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = create_filesystem(dl, part);
-/* $OpenBSD: powerpc64_installboot.c,v 1.4 2022/08/31 20:52:15 krw Exp $ */
+/* $OpenBSD: powerpc64_installboot.c,v 1.5 2022/09/09 15:53:16 kn Exp $ */
/*
* Copyright (c) 2011 Joel Sing <jsing@openbsd.org>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/stat.h>
+#include <sys/wait.h>
#include <err.h>
#include <errno.h>
part = findmbrfat(devfd, &dl);
if (part != -1) {
- create_filesystem(&dl, (char)part);
- return;
+ if (create_filesystem(&dl, (char)part) == -1)
+ exit(1);
}
}
warn("system('%s') failed", cmd);
return rslt;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt))
+ return -1;
}
return 0;
warn("system('%s') failed", cmd);
goto rmdir;
}
+ if (WIFEXITED(rslt) && WEXITSTATUS(rslt)) {
+ rslt = -1;
+ goto rmdir;
+ }
if (mount(MOUNT_MSDOS, dir, 0, &args) == -1) {
/* Try newfs'ing it. */
rslt = create_filesystem(dl, part);