Alias expansion has a recursion check which tries to break the cycle if
encountered. However, when reading end of input, the source type is set to SEOF while popping, whereas the recursion check code only checks for an SALIAS type. Fix: add a new SF_HASALIAS flag; change u.tblp from being valid if type is SALIAS to being valid if SF_HASALIAS is set; set SF_HASALIAS for the created SALIAS sources; set SF_HASALIAS and u.tblp when creating SALIAS whose next is SEOF on the SEOF source as well. Reported by Michael Hlavinka as Redhat Bug #474115
This commit is contained in:
parent
177f707a9f
commit
4897682502
4
check.t
4
check.t
@ -1,4 +1,4 @@
|
|||||||
# $MirOS: src/bin/mksh/check.t,v 1.246 2008/11/30 16:57:40 tg Exp $
|
# $MirOS: src/bin/mksh/check.t,v 1.247 2008/12/02 12:39:36 tg Exp $
|
||||||
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
||||||
@ -7,7 +7,7 @@
|
|||||||
# http://www.research.att.com/~gsf/public/ifs.sh
|
# http://www.research.att.com/~gsf/public/ifs.sh
|
||||||
|
|
||||||
expected-stdout:
|
expected-stdout:
|
||||||
@(#)MIRBSD KSH R36 2008/11/30
|
@(#)MIRBSD KSH R36 2008/12/02
|
||||||
description:
|
description:
|
||||||
Check version of shell.
|
Check version of shell.
|
||||||
stdin:
|
stdin:
|
||||||
|
14
lex.c
14
lex.c
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.76 2008/11/12 00:54:49 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.77 2008/12/02 12:39:37 tg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* states while lexing word
|
* states while lexing word
|
||||||
@ -903,16 +903,24 @@ yylex(int cf)
|
|||||||
/* prefer functions over aliases */
|
/* prefer functions over aliases */
|
||||||
ktdelete(p);
|
ktdelete(p);
|
||||||
else {
|
else {
|
||||||
Source *s;
|
Source *s = source;
|
||||||
|
|
||||||
for (s = source; s->type == SALIAS; s = s->next)
|
while (s->flags & SF_HASALIAS)
|
||||||
if (s->u.tblp == p)
|
if (s->u.tblp == p)
|
||||||
return LWORD;
|
return LWORD;
|
||||||
|
else
|
||||||
|
s = s->next;
|
||||||
/* push alias expansion */
|
/* push alias expansion */
|
||||||
s = pushs(SALIAS, source->areap);
|
s = pushs(SALIAS, source->areap);
|
||||||
s->start = s->str = p->val.s;
|
s->start = s->str = p->val.s;
|
||||||
s->u.tblp = p;
|
s->u.tblp = p;
|
||||||
|
s->flags |= SF_HASALIAS;
|
||||||
s->next = source;
|
s->next = source;
|
||||||
|
if (source->type == SEOF) {
|
||||||
|
/* prevent infinite recursion at EOS */
|
||||||
|
source->u.tblp = p;
|
||||||
|
source->flags |= SF_HASALIAS;
|
||||||
|
}
|
||||||
source = s;
|
source = s;
|
||||||
afree(yylval.cp, ATEMP);
|
afree(yylval.cp, ATEMP);
|
||||||
goto Again;
|
goto Again;
|
||||||
|
7
sh.h
7
sh.h
@ -103,9 +103,9 @@
|
|||||||
#define __SCCSID(x) __IDSTRING(sccsid,x)
|
#define __SCCSID(x) __IDSTRING(sccsid,x)
|
||||||
|
|
||||||
#ifdef EXTERN
|
#ifdef EXTERN
|
||||||
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.262 2008/11/30 10:33:39 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.263 2008/12/02 12:39:38 tg Exp $");
|
||||||
#endif
|
#endif
|
||||||
#define MKSH_VERSION "R36 2008/11/30"
|
#define MKSH_VERSION "R36 2008/12/02"
|
||||||
|
|
||||||
#ifndef MKSH_INCLUDES_ONLY
|
#ifndef MKSH_INCLUDES_ONLY
|
||||||
|
|
||||||
@ -1147,7 +1147,7 @@ struct source {
|
|||||||
union {
|
union {
|
||||||
const char **strv; /* string [] */
|
const char **strv; /* string [] */
|
||||||
struct shf *shf; /* shell file */
|
struct shf *shf; /* shell file */
|
||||||
struct tbl *tblp; /* alias (SALIAS) */
|
struct tbl *tblp; /* alias (SF_HASALIAS) */
|
||||||
char *freeme; /* also for SREREAD */
|
char *freeme; /* also for SREREAD */
|
||||||
} u;
|
} u;
|
||||||
int line; /* line number */
|
int line; /* line number */
|
||||||
@ -1178,6 +1178,7 @@ struct source {
|
|||||||
#define SF_ALIASEND BIT(2) /* faking space at end of alias */
|
#define SF_ALIASEND BIT(2) /* faking space at end of alias */
|
||||||
#define SF_TTY BIT(3) /* type == SSTDIN & it is a tty */
|
#define SF_TTY BIT(3) /* type == SSTDIN & it is a tty */
|
||||||
#define SF_FIRST BIT(4) /* initial state (to ignore UTF-8 BOM) */
|
#define SF_FIRST BIT(4) /* initial state (to ignore UTF-8 BOM) */
|
||||||
|
#define SF_HASALIAS BIT(5) /* u.tblp valid (SALIAS, SEOF) */
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
int i;
|
int i;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user