> Date: Thu, 25 Aug 2022 18:58:39 +0000
> From: Klemens Nanni <[email protected]>
>
> On Thu, Aug 25, 2022 at 06:36:55PM +0000, Klemens Nanni wrote:
> > Turns out all install media ship full copies of those two manuals due to
> > what can be described like a makefile TOCTOU.
> >
> > In /usr/src/distrib/special, Makefile.inc sets NOMAN=1 but */Makefile
> > only includes it in the very end through <bsd.prog.mk>.
> >
> > fdisk and disklabel have NOMAN logic before that include, so they don't
> > see it set yet and include the whole thing:
> >
> > $ make -C fdisk manual.o
> > mk -C fdisk manual.o
> > mandoc -Tascii
> > /usr/src/distrib/special/fdisk/../../../sbin/fdisk/fdisk.8 > fdisk.cat8
> > (echo 'const unsigned char manpage[] = {'; cat fdisk.cat8 | gzip -9c |
> > hexdump -ve '"0x" 1/1 "%02x,"'; echo '};'; echo 'const int manpage_sz =
> > sizeof(manpage);') > manual.c
> > cc -O2 -pipe -DHAS_MBR -fno-pie -Oz -fno-stack-protector
> > -fno-unwind-tables -fno-asynchronous-unwind-tables -MD -MP -c manual.c
> > $ size fdisk/obj/manual.o
> > text data bss dec hex
> > 3552 0 0 3552 de0
> >
> > Forcing it on the command line yields the desired behaviour:
> > $ make -C fdisk NOMAN=1 manual.o
> > (echo 'const unsigned char manpage[] = {'; echo 'no manual' | gzip -9c
> > | hexdump -ve '"0x" 1/1 "%02x,"'; echo '};'; echo 'const int manpage_sz =
> > sizeof(manpage);') > manual.c
> > cc -O2 -pipe -DHAS_MBR -fno-pie -Oz -fno-stack-protector
> > -fno-unwind-tables -fno-asynchronous-unwind-tables -MD -MP -c manual.c
> > $ size fdisk/obj/manual.o
> > text data bss dec hex
> > 36 0 0 36 24
> >
> > Same for disklabel, size before/after:
> > text data bss dec hex
> > 6160 0 0 6160 1810
> > 36 0 0 36 24
> >
> > I've confirmed this through an amd64 snapshots bsd.rd where I paged
> > through disklabel(8) via the 'M' command...
> >
> > Here's a minimal diff to highlight this non-obvious issue and avoid
> > reshuffling, i.e. cut down on differences with /usr/src/sbin/*/Makefile.
>
> Alternatively, here's a more invasive diff that rips out the compile
> logic around what I understand as purely man-install related NOMAN.
>
> Regular fdisk and disklabel always inlcude the manual and special ones
> just print "no manual." rather than gzipping the string, decompressing
> it at runtime and running a pager through it.
>
> I do like this a bit more as it makes the code simpler and just uses
> SMALL for this, as I'd expect; This saves even more bits.
>
> >
> > Haven't built ramdisks yet to see the final size decrease, but everyone
> > should be happy with this.
> >
> > OK?
Well, something tells me the inclusion of the manual pages for fdisk
and disklabel is deliberate. Makes some sense as these are complex
utilities and their interactive use is documented in those pages.
> Index: sbin/fdisk/Makefile
> ===================================================================
> RCS file: /cvs/src/sbin/fdisk/Makefile,v
> retrieving revision 1.46
> diff -u -p -r1.46 Makefile
> --- sbin/fdisk/Makefile 23 May 2022 16:58:11 -0000 1.46
> +++ sbin/fdisk/Makefile 25 Aug 2022 18:47:14 -0000
> @@ -23,12 +23,6 @@ CLEANFILES += fdisk.cat8 manual.c
>
> .include <bsd.own.mk>
>
> -.ifdef NOMAN
> -manual.c:
> - (echo 'const unsigned char manpage[] = {'; \
> - echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.else
> fdisk.cat8: fdisk.8
> mandoc -Tascii ${.ALLSRC} > ${.TARGET}
>
> @@ -36,7 +30,6 @@ manual.c: fdisk.cat8
> (echo 'const unsigned char manpage[] = {'; \
> cat fdisk.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.endif
>
> MAN= fdisk.8
>
> Index: sbin/fdisk/cmd.c
> ===================================================================
> RCS file: /cvs/src/sbin/fdisk/cmd.c,v
> retrieving revision 1.164
> diff -u -p -r1.164 cmd.c
> --- sbin/fdisk/cmd.c 25 Jul 2022 17:45:16 -0000 1.164
> +++ sbin/fdisk/cmd.c 25 Aug 2022 18:51:02 -0000
> @@ -509,6 +509,9 @@ Xflag(const char *args, struct mbr *mbr)
> int
> Xmanual(const char *args, struct mbr *mbr)
> {
> +#ifdef SMALL
> + printf("no manual.\n");
> +#else
> char *pager = "/usr/bin/less";
> char *p;
> FILE *f;
> @@ -527,6 +530,7 @@ Xmanual(const char *args, struct mbr *mb
> }
>
> signal(SIGPIPE, opipe);
> +#endif /* !SMALL */
>
> return CMD_CONT;
> }
> Index: sbin/disklabel/Makefile
> ===================================================================
> RCS file: /cvs/src/sbin/disklabel/Makefile,v
> retrieving revision 1.70
> diff -u -p -r1.70 Makefile
> --- sbin/disklabel/Makefile 20 Sep 2021 20:23:44 -0000 1.70
> +++ sbin/disklabel/Makefile 25 Aug 2022 18:46:48 -0000
> @@ -10,12 +10,6 @@ CLEANFILES += disklabel.cat8 manual.c
>
> .include <bsd.own.mk>
>
> -.ifdef NOMAN
> -manual.c:
> - (echo 'const unsigned char manpage[] = {'; \
> - echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.else
> disklabel.cat8: disklabel.8
> mandoc -Tascii ${.ALLSRC} > ${.TARGET}
>
> @@ -23,7 +17,6 @@ manual.c: disklabel.cat8
> (echo 'const unsigned char manpage[] = {'; \
> cat disklabel.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.endif
>
> .if ${MACHINE} == "sparc64"
> CFLAGS+= -DSUN_CYLCHECK -DSUN_AAT0
> Index: sbin/disklabel/editor.c
> ===================================================================
> RCS file: /cvs/src/sbin/disklabel/editor.c,v
> retrieving revision 1.373
> diff -u -p -r1.373 editor.c
> --- sbin/disklabel/editor.c 31 Jul 2022 14:29:19 -0000 1.373
> +++ sbin/disklabel/editor.c 25 Aug 2022 18:51:06 -0000
> @@ -346,6 +346,9 @@ editor(int f)
> break;
>
> case 'M': {
> +#ifdef SMALL
> + puts("no manual.");
> +#else
> sig_t opipe = signal(SIGPIPE, SIG_IGN);
> char *pager, *comm = NULL;
> extern const u_char manpage[];
> @@ -363,6 +366,7 @@ editor(int f)
>
> free(comm);
> (void)signal(SIGPIPE, opipe);
> +#endif /* !SMALL */
> break;
> }
>
> Index: distrib/special/fdisk/Makefile
> ===================================================================
> RCS file: /cvs/src/distrib/special/fdisk/Makefile,v
> retrieving revision 1.6
> diff -u -p -r1.6 Makefile
> --- distrib/special/fdisk/Makefile 23 May 2022 16:58:11 -0000 1.6
> +++ distrib/special/fdisk/Makefile 25 Aug 2022 18:46:12 -0000
> @@ -16,29 +16,12 @@
> # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
>
> PROG= fdisk
> -SRCS= fdisk.c user.c misc.c disk.c mbr.c part.c cmd.c manual.c gpt.c
> +SRCS= fdisk.c user.c misc.c disk.c mbr.c part.c cmd.c gpt.c
> +CFLAGS+= -DSMALL
> DPADD= ${LIBUTIL}
> LDADD= -lutil
> -CLEANFILES += fdisk.cat8 manual.c
>
> .include <bsd.own.mk>
> -
> -.ifdef NOMAN
> -manual.c:
> - (echo 'const unsigned char manpage[] = {'; \
> - echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.else
> -fdisk.cat8: fdisk.8
> - mandoc -Tascii ${.ALLSRC} > ${.TARGET}
> -
> -manual.c: fdisk.cat8
> - (echo 'const unsigned char manpage[] = {'; \
> - cat fdisk.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.endif
> -
> -MAN= fdisk.8
>
> .if ${MACHINE} == "amd64" || ${MACHINE} == "i386" || ${MACHINE} == "landisk"
> CFLAGS += -DHAS_MBR
> Index: distrib/special/disklabel/Makefile
> ===================================================================
> RCS file: /cvs/src/distrib/special/disklabel/Makefile,v
> retrieving revision 1.13
> diff -u -p -r1.13 Makefile
> --- distrib/special/disklabel/Makefile 21 Sep 2021 18:36:09 -0000
> 1.13
> +++ distrib/special/disklabel/Makefile 25 Aug 2022 18:45:42 -0000
> @@ -1,29 +1,12 @@
> # $OpenBSD: Makefile,v 1.13 2021/09/21 18:36:09 bluhm Exp $
>
> PROG= disklabel
> -SRCS= disklabel.c dkcksum.c editor.c manual.c
> +SRCS= disklabel.c dkcksum.c editor.c
> +CFLAGS+= -DSMALL
> DPADD= ${LIBUTIL}
> LDADD= -lutil
> -MAN= disklabel.8 disklabel.5
> -
> -CLEANFILES += disklabel.cat8 manual.c
>
> .include <bsd.own.mk>
> -
> -.ifdef NOMAN
> -manual.c:
> - (echo 'const unsigned char manpage[] = {'; \
> - echo 'no manual' | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.else
> -disklabel.cat8: disklabel.8
> - mandoc -Tascii ${.ALLSRC} > ${.TARGET}
> -
> -manual.c: disklabel.cat8
> - (echo 'const unsigned char manpage[] = {'; \
> - cat disklabel.cat8 | gzip -9c | hexdump -ve '"0x" 1/1 "%02x,"'; \
> - echo '};'; echo 'const int manpage_sz = sizeof(manpage);') > manual.c
> -.endif
>
> .if ${MACHINE} == "sparc64"
> CFLAGS+= -DSUN_CYLCHECK -DSUN_AAT0
>
>