<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta content="text/html; charset=utf-8">
</head>
<body>
It's possible Reflect.construct has introduced a security hole that was not present before the recent instantiation reform. Hopefully Mark can comment more.<br>
<br>
<br>
<div id="acompli_signature"><br>
</div>
<br>
<br>
<br>
<div class="gmail_quote">On Sat, Apr 25, 2015 at 9:52 PM -0700, "C. Scott Ananian"
<span dir="ltr"><<a href="mailto:ecmascript@cscott.net" target="_blank">ecmascript@cscott.net</a>></span> wrote:<br>
<br>
</div>
<div>
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">On Sat, Apr 25, 2015 at 6:58 PM, Kevin Smith <span dir="ltr">
<<a href="mailto:zenparsing@gmail.com" target="_blank">zenparsing@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left-width:1px; border-left-color:rgb(204,204,204); border-left-style:solid; padding-left:1ex">
<div dir="ltr">
<div class="gmail_quote"><span class="">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left-width:1px; border-left-color:rgb(204,204,204); border-left-style:solid; padding-left:1ex">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div>I think I'd rather see `Promise.resolve` changed to use `this.constructor` instead of `this.[[PromiseConstructor]]`, like every other Promise-related method.  Can someone who feels strongly otherwise give me the use case for `[[PromiseConstructor]]` existing?<br>
</div>
</div>
</div>
</div>
</blockquote>
</span></div>
</div>
</blockquote>
<div><br>
</div>
<div>I shouldn't have written `this.constructor` here.  I think looking at the object's prototype would be preferable.</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left-width:1px; border-left-color:rgb(204,204,204); border-left-style:solid; padding-left:1ex">
<div dir="ltr">
<div class="gmail_quote">
<div>"Promise.resolve", executed on a constructor C, with argument x, should only return x if x was created by C.[[Construct]].  Otherwise it should create an instance of C which is resolved with x.</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>"was created by C.[[Construct]] with NewTarget equal to C" is roughly how it is written currently.  But I think "should only return x if x is an instanceof C" (or "if the prototype of C is exactly C.prototype") would be the most logical behavior, since:</div>
<div> </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left-width:1px; border-left-color:rgb(204,204,204); border-left-style:solid; padding-left:1ex">
<div dir="ltr">
<div class="gmail_quote">
<div>If we used "x.constructor" to determine the actual constructor, then someone could just change the "constructor" property for x and fool someone who wrote "C.resolve(x)" and expected to get an instance of C back.<br>
</div>
</div>
</div>
</blockquote>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left-width:1px; border-left-color:rgb(204,204,204); border-left-style:solid; padding-left:1ex">
<div dir="ltr">
<div class="gmail_quote">
<div>It would be an unreliable, unsound conversion function.</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>I don't think this argument holds water since:</div>
<div><br>
</div>
<div>x = Reflect.construct(Promise, x, C);</div>
<div><br>
</div>
<div>is another fine way to fool someone who wrote "C.resolve(x)" and expected to get an instance of C back.</div>
<div><br>
</div>
<div>What's more, I can then do:<br>
</div>
<div><br>
</div>
<div>Object.setPrototype(x, SomeArbitraryThing);</div>
<div><br>
</div>
<div>and still fool C.resolve, and now x behaves nothing like a Promise (much less a C).</div>
<div><br>
</div>
<div>
<div>So we've got an unreliable, unsound conversion function.  What is it good for?</div>
<div><br>
</div>
<div>If our conversion is inherently "unsound", we might as well have it preserve duck typing.  If it's currently quacking like a duck (that is, x.prototype = Duck.prototype), then let's just call it a duck and be done with it.   Adding complexity to try to
 "preserve soundness" isn't actually working.</div>
<div><br>
</div>
<div>Again: but maybe I'm wrong.  Can someone with a security-sensitive application explain how Promise.resolve is actually the right thing for them?</div>
<div>  --scott<br>
</div>
</div>
<div><br>
</div>
</div>
</div>
</div>
</div>
</body>
</html>