Skip to content

Commit 65b5a7c

Browse files
authored
Merge pull request #8 from sarmadka/main
Fix potential memory access violation.
2 parents cfd6ffe + 1545891 commit 65b5a7c

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

Promises.alusus

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ module Promises {
2121
func removeUnresolvedPromise[ResultType: type](p: SrdRef[Promise[ResultType]]) {
2222
unresolvedPromisesLocker();
2323
if not p.nextUnresolvedPromise.isNull() p.nextUnresolvedPromise.prevUnresolvedPromise = p.prevUnresolvedPromise;
24-
if not p.prevUnresolvedPromise.isNull() p.prevUnresolvedPromise.nextUnresolvedPromise = p.nextUnresolvedPromise
25-
else unresolvedPromises = p.nextUnresolvedPromise;
24+
if not p.prevUnresolvedPromise.isNull() p.prevUnresolvedPromise.nextUnresolvedPromise = p.nextUnresolvedPromise;
25+
if unresolvedPromises.obj~ptr == p.obj~ptr unresolvedPromises = p.nextUnresolvedPromise;
2626
p.prevUnresolvedPromise.release();
2727
p.nextUnresolvedPromise.release();
2828
unresolvedPromisesUnlocker();
@@ -42,7 +42,6 @@ module Promises {
4242

4343
handler this.resolve(res: ResultType) {
4444
if this.status != Status.NEW return;
45-
removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
4645
this.result = res;
4746
this.status = Status.RESOLVED;
4847
def chain: ref[ChainNode[ResultType]](this.child);
@@ -53,6 +52,7 @@ module Promises {
5352
chain.onResolved(res);
5453
chain~no_deref = next;
5554
}
55+
removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
5656
}
5757

5858
handler this.resolve(p: SrdRef[Promise[ResultType]]) {
@@ -70,7 +70,6 @@ module Promises {
7070

7171
handler this.reject(err: SrdRef[Error]) {
7272
if this.status != Status.NEW return;
73-
removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
7473
this.error = err;
7574
this.status = Status.REJECTED;
7675
def chain: ref[ChainNode[ResultType]](this.child);
@@ -81,6 +80,7 @@ module Promises {
8180
chain.onRejected(err);
8281
chain~no_deref = next;
8382
}
83+
removeUnresolvedPromise[ResultType](SrdRef[Promise[ResultType]](this.wkThis));
8484
}
8585

8686
function new (): SrdRef[Promise[ResultType]] {
@@ -277,7 +277,10 @@ module Promises {
277277
def callback: closure (input: InputType, promise: ref[Promise[ResultType]]);
278278
handler (this: ChainNode[InputType]).onResolved(result: InputType) set_ptr {
279279
unshiftThis[chainNode];
280-
this.callback(result, this.promise);
280+
// Get a handle of the callback to make sure it never gets released before the call
281+
// is complete.
282+
def cb: callback~type = this.callback;
283+
cb(result, this.promise);
281284
}
282285
handler (this: ChainNode[InputType]).onRejected(err: SrdRef[Error]) set_ptr {
283286
unshiftThis[chainNode];
@@ -298,7 +301,10 @@ module Promises {
298301
}
299302
handler (this: ChainNode[InputType]).onRejected(err: SrdRef[Error]) set_ptr {
300303
unshiftThis[chainNode];
301-
this.callback(err, this.promise);
304+
// Get a handle of the callback to make sure it never gets released before the call
305+
// is complete.
306+
def cb: callback~type = this.callback;
307+
cb(err, this.promise);
302308
}
303309
handler (this:Resolver[InputType]).getResolverType(): Int set_ptr {
304310
return ResolverType.CATCH_RESOLVER;

0 commit comments

Comments
 (0)