Module Name: src Committed By: sjg Date: Thu Jan 26 20:48:18 UTC 2023
Modified Files: src/usr.bin/make: main.c make.1 make.h var.c src/usr.bin/make/unit-tests: varname-dot-newline.exp varname-dot-newline.mk Log Message: make: some variables should be read-only Make variables like .newline and .MAKE.{GID,PID,PPID,UID} read-only. Reviewed by: rillig To generate a diff of this commit: cvs rdiff -u -r1.588 -r1.589 src/usr.bin/make/main.c cvs rdiff -u -r1.359 -r1.360 src/usr.bin/make/make.1 cvs rdiff -u -r1.310 -r1.311 src/usr.bin/make/make.h cvs rdiff -u -r1.1038 -r1.1039 src/usr.bin/make/var.c cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/varname-dot-newline.exp cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/varname-dot-newline.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/main.c diff -u src/usr.bin/make/main.c:1.588 src/usr.bin/make/main.c:1.589 --- src/usr.bin/make/main.c:1.588 Tue Jan 24 00:24:02 2023 +++ src/usr.bin/make/main.c Thu Jan 26 20:48:17 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.588 2023/01/24 00:24:02 sjg Exp $ */ +/* $NetBSD: main.c,v 1.589 2023/01/26 20:48:17 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -111,7 +111,7 @@ #include "trace.h" /* "@(#)main.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: main.c,v 1.588 2023/01/24 00:24:02 sjg Exp $"); +MAKE_RCSID("$NetBSD: main.c,v 1.589 2023/01/26 20:48:17 sjg Exp $"); #if defined(MAKE_NATIVE) && !defined(lint) __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 " "The Regents of the University of California. " @@ -1346,13 +1346,13 @@ main_Init(int argc, char **argv) */ Targ_Init(); Var_Init(); - Global_Set(".MAKE.OS", utsname.sysname); + Global_Set_ReadOnly(".MAKE.OS", utsname.sysname); Global_Set("MACHINE", machine); Global_Set("MACHINE_ARCH", machine_arch); #ifdef MAKE_VERSION Global_Set("MAKE_VERSION", MAKE_VERSION); #endif - Global_Set(".newline", "\n"); /* handy for :@ loops */ + Global_Set_ReadOnly(".newline", "\n"); /* handy for :@ loops */ #ifndef MAKEFILE_PREFERENCE_LIST /* This is the traditional preference for makefiles. */ # define MAKEFILE_PREFERENCE_LIST "makefile Makefile" @@ -1398,13 +1398,13 @@ main_Init(int argc, char **argv) snprintf(buf, sizeof buf, "%d", makelevel); Global_Set(MAKE_LEVEL, buf); snprintf(buf, sizeof buf, "%u", myPid); - Global_Set(".MAKE.PID", buf); + Global_Set_ReadOnly(".MAKE.PID", buf); snprintf(buf, sizeof buf, "%u", getppid()); - Global_Set(".MAKE.PPID", buf); + Global_Set_ReadOnly(".MAKE.PPID", buf); snprintf(buf, sizeof buf, "%u", getuid()); - Global_Set(".MAKE.UID", buf); + Global_Set_ReadOnly(".MAKE.UID", buf); snprintf(buf, sizeof buf, "%u", getgid()); - Global_Set(".MAKE.GID", buf); + Global_Set_ReadOnly(".MAKE.GID", buf); } if (makelevel > 0) { char pn[1024]; Index: src/usr.bin/make/make.1 diff -u src/usr.bin/make/make.1:1.359 src/usr.bin/make/make.1:1.360 --- src/usr.bin/make/make.1:1.359 Tue Jan 24 00:24:02 2023 +++ src/usr.bin/make/make.1 Thu Jan 26 20:48:17 2023 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.359 2023/01/24 00:24:02 sjg Exp $ +.\" $NetBSD: make.1,v 1.360 2023/01/26 20:48:17 sjg Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" -.Dd January 23, 2023 +.Dd January 26, 2023 .Dt MAKE 1 .Os .Sh NAME @@ -940,6 +940,7 @@ executes. .It Va .MAKE.GID The numeric group ID of the user running .Nm . +It is read-only. .It Va .MAKE.JOB.PREFIX If .Nm @@ -1130,6 +1131,7 @@ Used to create files in a separate direc .It Va .MAKE.OS The name of the operating system, see .Xr uname 1 . +It is read-only. .It Va .MAKEOVERRIDES This variable is used to record the names of variables assigned to on the command line, so that they may be exported as part of @@ -1154,9 +1156,11 @@ This allows makefiles to test for this s .It Va .MAKE.PID The process ID of .Nm . +It is read-only. .It Va .MAKE.PPID The parent process ID of .Nm . +It is read-only. .It Va MAKE_PRINT_VAR_ON_ERROR When .Nm @@ -1198,6 +1202,7 @@ treated as normal sources. .It Va .MAKE.UID The numeric ID of the user running .Nm . +It is read-only. .\" 'MAKE_VERSION' is intentionally undocumented .\" since it is only defined in the bmake distribution, .\" but not in NetBSD's native make. @@ -1209,6 +1214,7 @@ The numeric ID of the user running .\" since it is obsolete. .It Va .newline This variable is simply assigned a newline character as its value. +It is read-only. This allows expansions using the .Cm \&:@ modifier to put a newline between Index: src/usr.bin/make/make.h diff -u src/usr.bin/make/make.h:1.310 src/usr.bin/make/make.h:1.311 --- src/usr.bin/make/make.h:1.310 Mon Jan 23 23:01:52 2023 +++ src/usr.bin/make/make.h Thu Jan 26 20:48:17 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: make.h,v 1.310 2023/01/23 23:01:52 sjg Exp $ */ +/* $NetBSD: make.h,v 1.311 2023/01/26 20:48:17 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -1031,6 +1031,7 @@ void Var_ReadOnly(const char *, bool); void Global_Set(const char *, const char *); void Global_Append(const char *, const char *); void Global_Delete(const char *); +void Global_Set_ReadOnly(const char *, const char *); /* util.c */ typedef void (*SignalProc)(int); Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.1038 src/usr.bin/make/var.c:1.1039 --- src/usr.bin/make/var.c:1.1038 Tue Jan 24 00:19:14 2023 +++ src/usr.bin/make/var.c Thu Jan 26 20:48:17 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1038 2023/01/24 00:19:14 sjg Exp $ */ +/* $NetBSD: var.c,v 1.1039 2023/01/26 20:48:17 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -139,7 +139,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.1038 2023/01/24 00:19:14 sjg Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1039 2023/01/26 20:48:17 sjg Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -1078,6 +1078,12 @@ Global_Delete(const char *name) Var_Delete(SCOPE_GLOBAL, name); } +void +Global_Set_ReadOnly(const char *name, const char *value) +{ + Var_SetWithFlags(SCOPE_GLOBAL, name, value, VAR_SET_READONLY); +} + /* * Append the value to the named variable. * Index: src/usr.bin/make/unit-tests/varname-dot-newline.exp diff -u src/usr.bin/make/unit-tests/varname-dot-newline.exp:1.3 src/usr.bin/make/unit-tests/varname-dot-newline.exp:1.4 --- src/usr.bin/make/unit-tests/varname-dot-newline.exp:1.3 Tue Jan 17 19:42:47 2023 +++ src/usr.bin/make/unit-tests/varname-dot-newline.exp Thu Jan 26 20:48:18 2023 @@ -1,4 +1,3 @@ -make: "varname-dot-newline.mk" line 30: The .newline variable can be overwritten. Just don't do that. first second backslash newline: <\ Index: src/usr.bin/make/unit-tests/varname-dot-newline.mk diff -u src/usr.bin/make/unit-tests/varname-dot-newline.mk:1.5 src/usr.bin/make/unit-tests/varname-dot-newline.mk:1.6 --- src/usr.bin/make/unit-tests/varname-dot-newline.mk:1.5 Tue Jan 17 19:42:47 2023 +++ src/usr.bin/make/unit-tests/varname-dot-newline.mk Thu Jan 26 20:48:18 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varname-dot-newline.mk,v 1.5 2023/01/17 19:42:47 rillig Exp $ +# $NetBSD: varname-dot-newline.mk,v 1.6 2023/01/26 20:48:18 sjg Exp $ # # Tests for the special .newline variable, which contains a single newline # character (U+000A). @@ -16,23 +16,16 @@ BACKSLASH_NEWLINE:= \${.newline} -# Contrary to the special variable named "" that is used in expressions like -# ${:Usome-value}, the variable ".newline" is not protected against -# modification. Nobody exploits that though. +# Check that .newline is read-only NEWLINE:= ${.newline} .newline= overwritten -.if ${.newline} == ${NEWLINE} -. info The .newline variable cannot be overwritten. Good. -.else -. info The .newline variable can be overwritten. Just don't do that. +.if ${.newline} != ${NEWLINE} +. error The .newline variable can be overwritten. It should be read-only. .endif -# Restore the original value. -.newline= ${NEWLINE} - all: @echo 'first${.newline}second' @echo 'backslash newline: <${BACKSLASH_NEWLINE}>'