From jmz@cabri.obs-besancon.fr  Mon Jan  9 17:49:46 1995
Received: from cabri.obs-besancon.fr (cabri.obs-besancon.fr [193.52.184.3]) by freefall.cdrom.com (8.6.9/8.6.6) with SMTP id RAA08891 for <FreeBSD-gnats-submit@freebsd.org>; Mon, 9 Jan 1995 17:49:44 -0800
Received: by cabri.obs-besancon.fr (5.57/Ultrix3.0-C)
	id AA18878; Tue, 10 Jan 95 02:46:05 +0100
Message-Id: <9501100146.AA18878@cabri.obs-besancon.fr>
Date: Tue, 10 Jan 95 02:46:05 +0100
From: jmz@cabri.obs-besancon.fr
Reply-To: jmz@cabri.obs-besancon.fr
To: FreeBSD-gnats-submit@freebsd.org
Subject: Init
X-Send-Pr-Version: 3.2

>Number:         103
>Category:       bin
>Synopsis:       Init can't execute commands requiring complex args
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jan  9 17:50:00 1995
>Closed-Date:    Tue Jan 10 13:20:11 PST 1995
>Last-Modified:  Tue Nov 27 18:41:26 PST 2001
>Originator:     Jean-Marc Zucconi
>Release:        FreeBSD 2.1.0-Developpement i386
>Organization:
>Environment:

>Description:

It is not possible to start processes (from /etc/ttys) which need complex 
arguments, like empty strings or args with spaces.

>How-To-Repeat:

Try to put in /etc/ttys the following program, which is normally started
from the shell with
       /usr/local/sbin/mgetty -m '"" "\d\d\d+++\d\d\d\\r\dATQ0V1" "OK"'

>Fix:
With the patch below, the entry in /etc/ttys may now be specified as

cua01 "/usr/local/sbin/mgetty -m '\"\" \"\d\d\d+++\d\d\d\\r\dATQ0V1\" \"OK\"'"  unknown on secure

*** init.c.orig	Fri Oct 14 18:15:40 1994
--- init.c	Tue Jan 10 01:36:50 1995
***************
*** 865,878 ****
  construct_argv(command)
  	char *command;
  {
  	register int argc = 0;
  	register char **argv = (char **) malloc(((strlen(command) + 1) / 2 + 1)
  						* sizeof (char *));
- 	static const char separators[] = " \t";
  
! 	if ((argv[argc++] = strtok(command, separators)) == 0)
  		return 0;
! 	while (argv[argc++] = strtok((char *) 0, separators))
  		continue;
  	return argv;
  }
--- 865,878 ----
  construct_argv(command)
  	char *command;
  {
+ 	char *strk (char *);
  	register int argc = 0;
  	register char **argv = (char **) malloc(((strlen(command) + 1) / 2 + 1)
  						* sizeof (char *));
  
! 	if ((argv[argc++] = strk(command)) == 0)
  		return 0;
! 	while (argv[argc++] = strk((char *) 0))
  		continue;
  	return argv;
  }
***************
*** 1377,1380 ****
--- 1377,1418 ----
  	warning("some processes would not die; ps axl advised");
  
  	return (state_func_t) single_user;
+ }
+ char *
+ strk (char *p)
+ {
+     static char *t;
+     char *q;
+     int c;
+ 
+     if (p)
+ 	t = p;
+     if (!t)
+ 	return 0;
+ 
+     c = *t;
+     while (c == ' ' || c == '\t' ) 
+ 	c = *++t;
+     if (!c) {
+ 	t = 0;
+ 	return 0;
+     }
+     q = t;
+     if (c == '\'') {
+ 	c = *++t;
+ 	q = t;
+ 	while (c && c != '\'') 
+ 	    c = *++t;
+ 	if (!c)  /* unterminated string */
+ 	    q = t = 0;
+ 	else
+ 	    *t++ = 0;
+     } else {
+ 	while (c && c != ' ' && c != '\t' )
+ 	    c = *++t;
+ 	*t++ = 0;
+ 	if (!c) 
+ 	    t = 0;
+     }
+     return q;
  }

>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: ache 
State-Changed-When: Tue Jan 10 13:20:11 PST 1995 
State-Changed-Why:  
Applied. 
>Unformatted:



