Fix calling split() with a third argument that lives in the target array
This commit is contained in:
parent
2dc7e5ff1a
commit
d45db5e9d8
@ -23,3 +23,8 @@ and also if CONVFMT changed.
|
||||
|
||||
7. unary-plus: Unary plus on a string constant returned the string.
|
||||
Instead, it should convert the value to numeric and give that value.
|
||||
|
||||
X. split-fs-from-array: If the third argument to split() comes from the
|
||||
array passed as the second argument, then split() would previously read
|
||||
from the freed memory and possibly produce incorrect results (depending
|
||||
on the system's malloc()/free() behaviour.)
|
||||
|
5
bugs-fixed/split-fs-from-array.awk
Normal file
5
bugs-fixed/split-fs-from-array.awk
Normal file
@ -0,0 +1,5 @@
|
||||
BEGIN {
|
||||
a[1] = "elephantie"
|
||||
a[2] = "e"
|
||||
print split(a[1],a,a[2]), a[2], a[3], split(a[2],a,a[2])
|
||||
}
|
1
bugs-fixed/split-fs-from-array.ok
Normal file
1
bugs-fixed/split-fs-from-array.ok
Normal file
@ -0,0 +1 @@
|
||||
4 l phanti 2
|
10
run.c
10
run.c
@ -1240,8 +1240,9 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
|
||||
{
|
||||
Cell *x = 0, *y, *ap;
|
||||
char *s, *origs;
|
||||
char *fs, *origfs = NULL;
|
||||
int sep;
|
||||
char *t, temp, num[50], *fs = 0;
|
||||
char *t, temp, num[50];
|
||||
int n, tempstat, arg3type;
|
||||
|
||||
y = execute(a[0]); /* source string */
|
||||
@ -1251,7 +1252,8 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
|
||||
fs = *FS;
|
||||
else if (arg3type == STRING) { /* split(str,arr,"string") */
|
||||
x = execute(a[2]);
|
||||
fs = getsval(x);
|
||||
origfs = fs = strdup(getsval(x));
|
||||
tempfree(x);
|
||||
} else if (arg3type == REGEXPR)
|
||||
fs = "(regexpr)"; /* split(str,arr,/regexpr/) */
|
||||
else
|
||||
@ -1366,9 +1368,7 @@ Cell *split(Node **a, int nnn) /* split(a[0], a[1], a[2]); a[3] is type */
|
||||
tempfree(ap);
|
||||
tempfree(y);
|
||||
free(origs);
|
||||
if (a[2] != 0 && arg3type == STRING) {
|
||||
tempfree(x);
|
||||
}
|
||||
free(origfs);
|
||||
x = gettemp();
|
||||
x->tval = NUM;
|
||||
x->fval = n;
|
||||
|
Loading…
x
Reference in New Issue
Block a user