Fix calling split() with a third argument that lives in the target array

This commit is contained in:
Cody Peter Mello 2018-09-18 15:20:44 -07:00
parent 2dc7e5ff1a
commit d45db5e9d8
4 changed files with 16 additions and 5 deletions

View File

@ -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.)

View 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])
}

View File

@ -0,0 +1 @@
4 l phanti 2

10
run.c
View File

@ -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;