diff --git a/usr.bin/xinstall/Makefile b/usr.bin/xinstall/Makefile index 135245509..297f6eac5 100644 --- a/usr.bin/xinstall/Makefile +++ b/usr.bin/xinstall/Makefile @@ -1,27 +1,25 @@ -# $NetBSD: Makefile,v 1.25 2015/06/17 15:34:08 christos Exp $ +# $NetBSD: Makefile,v 1.29 2020/10/30 20:05:00 rillig Exp $ # @(#)Makefile 8.1 (Berkeley) 6/6/93 .include PROG= xinstall -SRCS= xinstall.c getid.c metachar.c +SRCS= xinstall.c getid.c MAN= install.1 -.PATH: ${NETBSDSRCDIR}/usr.bin/make -CPPFLAGS+= -I${NETBSDSRCDIR}/usr.bin/make - .PATH: ${NETBSDSRCDIR}/usr.sbin/mtree CPPFLAGS+= -I${NETBSDSRCDIR}/usr.sbin/mtree -CPPFLAGS+= -DHAVE_POSIX_SPAWN .if (${HOSTPROG:U} == "") +CPPFLAGS+= -DHAVE_POSIX_SPAWN DPADD+= ${LIBUTIL} LDADD+= -lutil .endif COPTS.xinstall.c += -Wno-format-nonliteral - PROGNAME=install +CWARNFLAGS.gcc+= ${GCC_NO_FORMAT_TRUNCATION} + .include diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c index b92a9d663..e0917877f 100644 --- a/usr.bin/xinstall/xinstall.c +++ b/usr.bin/xinstall/xinstall.c @@ -1,4 +1,4 @@ -/* $NetBSD: xinstall.c,v 1.124 2015/06/19 17:20:02 christos Exp $ */ +/* $NetBSD: xinstall.c,v 1.126 2020/10/30 20:05:00 rillig Exp $ */ /* * Copyright (c) 1987, 1993 @@ -29,6 +29,37 @@ * SUCH DAMAGE. */ +/*- + * Copyright (c) 2015 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#define __MKTEMP_OK__ /* All uses of mktemp have been checked */ + #if HAVE_NBTOOL_CONFIG_H #include "nbtool_config.h" #else @@ -46,11 +77,10 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 1993\ #if 0 static char sccsid[] = "@(#)xinstall.c 8.1 (Berkeley) 7/21/93"; #else -__RCSID("$NetBSD: xinstall.c,v 1.124 2015/06/19 17:20:02 christos Exp $"); +__RCSID("$NetBSD: xinstall.c,v 1.126 2020/10/30 20:05:00 rillig Exp $"); #endif #endif /* not lint */ -#define __MKTEMP_OK__ /* All uses of mktemp have been checked */ #include #include #include @@ -83,7 +113,6 @@ __RCSID("$NetBSD: xinstall.c,v 1.124 2015/06/19 17:20:02 christos Exp $"); #include "pathnames.h" #include "mtree.h" -#include "metachar.h" #define BACKUP_SUFFIX ".old" @@ -142,6 +171,7 @@ static void strip(const char *); __dead static void usage(void); static char *xbasename(char *); static char *xdirname(char *); +static int needshell(const char *, int); int main(int argc, char *argv[]) @@ -1291,3 +1321,58 @@ usage(void) prog, prog, prog); exit(1); } + +/* + * The following array is used to make a fast determination of which + * characters are interpreted specially by the shell. If a command + * contains any of these characters, it is executed by the shell, not + * directly by us. + */ +static unsigned char _metachar[128] = { +/* nul soh stx etx eot enq ack bel */ + 1, 0, 0, 0, 0, 0, 0, 0, +/* bs ht nl vt np cr so si */ + 0, 0, 1, 0, 0, 0, 0, 0, +/* dle dc1 dc2 dc3 dc4 nak syn etb */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* can em sub esc fs gs rs us */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* sp ! " # $ % & ' */ + 0, 1, 1, 1, 1, 0, 1, 1, +/* ( ) * + , - . / */ + 1, 1, 1, 0, 0, 0, 0, 0, +/* 0 1 2 3 4 5 6 7 */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* 8 9 : ; < = > ? */ + 0, 0, 0, 1, 1, 0, 1, 1, +/* @ A B C D E F G */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* H I J K L M N O */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* P Q R S T U V W */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* X Y Z [ \ ] ^ _ */ + 0, 0, 0, 1, 1, 1, 1, 0, +/* ` a b c d e f g */ + 1, 0, 0, 0, 0, 0, 0, 0, +/* h i j k l m n o */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* p q r s t u v w */ + 0, 0, 0, 0, 0, 0, 0, 0, +/* x y z { | } ~ del */ + 0, 0, 0, 1, 1, 1, 1, 0, +}; + +#define ismeta(c) _metachar[(c) & 0x7f] + +static int +needshell(const char *cmd, int white) +{ + while (!ismeta(*cmd) && *cmd != ':' && *cmd != '=') { + if (white && isspace((unsigned char)*cmd)) + break; + cmd++; + } + + return *cmd != '\0'; +}