From owner-freebsd-bugs@FreeBSD.ORG Wed Mar 29 17:20:19 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7974116A423 for ; Wed, 29 Mar 2006 17:20:19 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id DF46E43D46 for ; Wed, 29 Mar 2006 17:20:18 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k2THKICt094275 for ; Wed, 29 Mar 2006 17:20:18 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k2THKIR2094274; Wed, 29 Mar 2006 17:20:18 GMT (envelope-from gnats) Resent-Date: Wed, 29 Mar 2006 17:20:18 GMT Resent-Message-Id: <200603291720.k2THKIR2094274@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Alex Kapranoff Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id AA78B16A400 for ; Wed, 29 Mar 2006 17:19:31 +0000 (UTC) (envelope-from kappa@capella.park.rambler.ru) Received: from relay0.rambler.ru (relay0.rambler.ru [81.19.66.187]) by mx1.FreeBSD.org (Postfix) with ESMTP id 3AC0543D53 for ; Wed, 29 Mar 2006 17:19:30 +0000 (GMT) (envelope-from kappa@capella.park.rambler.ru) Received: from relay0.rambler.ru (localhost [127.0.0.1]) by relay0.rambler.ru (Postfix) with ESMTP id 3C49F5F7F for ; Wed, 29 Mar 2006 21:19:29 +0400 (MSD) Received: from capella.park.rambler.ru (capella.park.rambler.ru [81.19.65.30]) by relay0.rambler.ru (Postfix) with ESMTP id 19A405F57 for ; Wed, 29 Mar 2006 21:19:29 +0400 (MSD) Received: by capella.park.rambler.ru (Postfix, from userid 1001) id 4C1CF40D3; Wed, 29 Mar 2006 21:19:29 +0400 (MSD) Message-Id: <20060329171929.4C1CF40D3@capella.park.rambler.ru> Date: Wed, 29 Mar 2006 21:19:29 +0400 (MSD) From: Alex Kapranoff To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/95079: [patch] apply(1) dies when there are two %1 in command X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Mar 2006 17:20:19 -0000 >Number: 95079 >Category: bin >Synopsis: [patch] apply(1) dies when there are two %1 in command >Confidential: no >Severity: non-critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Mar 29 17:20:17 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Alex Kapranoff >Release: FreeBSD 5.2-CURRENT i386 >Organization: Inner Mongolia >Environment: FreeBSD capella.park.rambler.ru 6.1-PRERELEASE FreeBSD 6.1-PRERELEASE #0: Fri Mar 17 16:20:26 MSK 2006 root@capella.park.rambler.ru:/usr/obj/usr/src/sys/CAPELLA2 i386 >Description: apply(1) was not designed to handle situations when user wants to use the same argument in the command more than once. >How-To-Repeat: % ls 00045qqf.png LinkPotProto.zip % apply 'echo %1 %1' * 00045qqf.png 00045qqf.png apply: snprintf() failed: Unknown error: 0 % >Fix: manpage patch includes an example. diff -ru /usr/src/usr.bin/apply/apply.1 ./apply.1 --- /usr/src/usr.bin/apply/apply.1 Mon Jul 25 12:12:13 2005 +++ ./apply.1 Wed Mar 29 21:12:44 2006 @@ -123,7 +123,9 @@ 5 times; and .It Li "apply \'ln %1 /usr/joe\'" * links all files in the current directory to the directory -.Pa /usr/joe . +.Pa /usr/joe ; +.It Li "apply \'diff %1 %1.bak\'" * +compares all files in the current directory to their backup copies. .El .Sh HISTORY The diff -ru /usr/src/usr.bin/apply/apply.c ./apply.c --- /usr/src/usr.bin/apply/apply.c Wed Apr 28 00:41:25 2004 +++ ./apply.c Wed Mar 29 21:06:28 2006 @@ -66,6 +66,8 @@ size_t clen, cmdsize, l; char *c, *cmd, *name, *p, *q, *shell, *slashp, *tmpshell; + int cn[10]; + debug = 0; magic = '%'; /* Default magic char is `%'. */ nargs = -1; @@ -99,13 +101,15 @@ /* * The command to run is argv[0], and the args are argv[1..]. * Look for %digit references in the command, remembering the - * largest one. + * largest one and count each %digit. */ + bzero(cn, sizeof cn); for (n = 0, p = argv[0]; *p != '\0'; ++p) if (p[0] == magic && isdigit(p[1]) && p[1] != '0') { ++p; if (p[0] - '0' > n) n = p[0] - '0'; + ++cn[p[0] - '0']; } /* @@ -187,19 +191,15 @@ * there's enough space to build it. */ for (l = strlen(cmd), i = 0; i < nargs; i++) - l += strlen(argv[i+1]); + l += strlen(argv[i+1]) * cn[i]; if (l > clen && (c = realloc(c, clen = l)) == NULL) err(1, NULL); /* Expand command argv references. */ for (p = cmd, q = c; *p != '\0'; ++p) if (p[0] == magic && isdigit(p[1]) && p[1] != '0') { - offset = snprintf(q, l, "%s", - argv[(++p)[0] - '0']); - if ((size_t)offset >= l) - err(1, "snprintf() failed"); - q += offset; - l -= offset; + strlcpy(q, argv[(++p)[0] - '0'], c + clen - q); + q += strlen(q); } else *q++ = *p; >Release-Note: >Audit-Trail: >Unformatted: