summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2020-07-09 06:42:04 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-07-09 06:42:04 -0700
commitdb663c43dee33d7473db7492222b99cdaf34c1ff (patch)
tree80f661f8afc0827325ffa307b18bb4aece701dd2 /sysif.c
parent0976864358ad2fa493a1085b4f882a55da4328e8 (diff)
downloadtxr-db663c43dee33d7473db7492222b99cdaf34c1ff.tar.gz
txr-db663c43dee33d7473db7492222b99cdaf34c1ff.tar.bz2
txr-db663c43dee33d7473db7492222b99cdaf34c1ff.zip
opendir: gc-correctness.
* sysif.c (opendir_wrap): Store path into d->path after allocating the cobj, because d->path may be the only reference to that object, and the cobj call may trigger gc.
Diffstat (limited to 'sysif.c')
-rw-r--r--sysif.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sysif.c b/sysif.c
index 4d1a8b6d..6af1aca2 100644
--- a/sysif.c
+++ b/sysif.c
@@ -2255,9 +2255,10 @@ static val opendir_wrap(val path, val prefix_p)
path, num(errno), errno_to_str(errno), nao);
} else {
struct dir *d = coerce(struct dir *, chk_malloc(sizeof *d));
+ val obj = cobj(coerce(mem_t *, d), dir_s, &opendir_ops);
d->dir = dir;
d->path = if2(default_null_arg(prefix_p), path);
- return cobj(coerce(mem_t *, d), dir_s, &opendir_ops);
+ return obj;
}
}