Skip to content

Commit

Permalink
Fix 'typeset -xu', 'typeset -xl' (rhbz#1188377)
Browse files Browse the repository at this point in the history
'typeset -xu' and 'typeset -xl' would export the variable but fail
to change case in the value under certain conditions.

Original patch:
https://src.fedoraproject.org/rpms/ksh/blob/642af4d6/f/ksh-20120801-xufix.patch

This applies the patch essentially without change and adds a
regression test based on the reproducer provided in the RH bug.

Unfortunately there is no description of how the patch works and
it's a little obscure to me. As far as I can figure out, the cause
of the problem was that nv_newattr() erroneously processed a
nonexistent size option-argument such as what can be given to
options like typeset -F, e.g. typeset -F3 for 3 digits after the
dot. A nonexistent size argument is represented by the value of -1.
  • Loading branch information
McDutchie committed Sep 30, 2020
1 parent ba0b1bb commit fdb9781
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 2 deletions.
5 changes: 5 additions & 0 deletions NEWS
Expand Up @@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh

Any uppercase BUG_* names are modernish shell bug IDs.

2020-09-30:

- Fixed: 'typeset -xu' and 'typeset -xl' (export + change case) failed to
change the case of a variable's value in certain conditions.

2020-09-28:

- While executing a ksh-style function, ksh 93u+ ignored all signals for which
Expand Down
1 change: 1 addition & 0 deletions src/cmd/ksh93/bltins/typeset.c
Expand Up @@ -94,6 +94,7 @@ int b_readonly(int argc,char *argv[],Shbltin_t *context)
memset((void*)&tdata,0,sizeof(tdata));
tdata.sh = context->shp;
tdata.aflag = '-';
tdata.argnum = -1; /* tell nv_newattr() that we should not change size */
while((flag = optget(argv,*command=='e'?sh_optexport:sh_optreadonly))) switch(flag)
{
case 'p':
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ksh93/include/version.h
Expand Up @@ -17,4 +17,4 @@
* David Korn <dgk@research.att.com> *
* *
***********************************************************************/
#define SH_RELEASE "93u+m 2020-09-28"
#define SH_RELEASE "93u+m 2020-09-30"
4 changes: 3 additions & 1 deletion src/cmd/ksh93/sh/name.c
Expand Up @@ -2954,10 +2954,12 @@ void nv_newattr (register Namval_t *np, unsigned newatts, int size)
nv_onattr(np,NV_EXPORT);
sh_envput(shp->env,np);
}
if((n^newatts)==NV_EXPORT)
if((n^newatts)==NV_EXPORT && size==-1)
return;
}
oldsize = nv_size(np);
if(size==-1)
size = oldsize;
if((size==oldsize|| (n&NV_INTEGER)) && !trans && ((n^newatts)&~NV_NOCHANGE)==0)
{
if(size)
Expand Down
17 changes: 17 additions & 0 deletions src/cmd/ksh93/tests/attributes.sh
Expand Up @@ -30,6 +30,23 @@ integer Errors=0

[[ -d $tmp && -w $tmp && $tmp == "$PWD" ]] || { err\_exit "$LINENO" '$tmp not set; run this from shtests. Aborting.'; exit 1; }

# ======
# as of 93u+, typeset -xu/-xl failed to change case in a value (rhbz#1188377)
# (this test failed to fail when it was added at the end, so it's at the start)
unset test_u test_xu test_txu
typeset -u test_u=uppercase
typeset -xu test_xu=uppercase
typeset -txu test_txu=uppercase
typeset -l test_l=LOWERCASE
typeset -xl test_xl=LOWERCASE
typeset -txl test_txl=LOWERCASE
exp="UPPERCASE UPPERCASE UPPERCASE lowercase lowercase lowercase"
got="${test_u} ${test_xu} ${test_txu} ${test_l} ${test_xl} ${test_txl}"
[[ $got == "$exp" ]] || err_exit "typeset failed to change case in variable" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
unset ${!test_*}

# ======
r=readonly u=Uppercase l=Lowercase i=22 i8=10 L=abc L5=def uL5=abcdef xi=20
x=export t=tagged H=hostname LZ5=026 RZ5=026 Z5=123 lR5=ABcdef R5=def n=l
for option in u l i i8 L L5 LZ5 RZ5 Z5 r x H t R5 uL5 lR5 xi n
Expand Down

3 comments on commit fdb9781

@hyenias
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am going to review this change as it impacts code I have been developing.

@hyenias
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have figured out this rhbz#1188377 patch. Through inspection and testing; I have created, tested, and verified a better performing and less impactful patch than this one. As previously stated, I was motivated to do so based on my other future code changes allowing numerics with precision of zero. I will be submitting a pull request very soon for the new fixes to current code base.

@hyenias
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have submitted a #147.

Please sign in to comment.