Hi,

I believe the Vector class is already checking for overflows. I looked quickly 
and it seems that when trying to allocate / reallocate the Vector buffer, we 
will call CRASH() if:
(newCapacity > std::numeric_limits<unsigned>::max() / sizeof(T))

Kr, 
--
Chris Dumez - Apple Inc.
Cupertino, CA




> On Nov 19, 2014, at 1:57 PM, Geoffrey Garen <gga...@apple.com> wrote:
> 
> I don’t haver a specific opinion on size_t vs unsigned, but I have a related 
> point:
> 
> If Vector uses unsigned, then it must RELEASE_ASSERT that it does not 
> overflow unsigned when growing. 
> 
> Even if most normal content allocates < 4GB, exploit content surely will try 
> to allocate > 4GB.
> 
> Chris, maybe you can make this change in trunk, since trunk uses unsigned?
> 
> Geoff
> 
>> On Nov 19, 2014, at 1:50 PM, Alexey Proskuryakov <a...@webkit.org 
>> <mailto:a...@webkit.org>> wrote:
>> 
>> 
>> That makes good sense for internal implementation, do you think that class 
>> API should also use a custom type, or should it use size_t?
>> 
>> With Vector though, I don't know how we would differentiate code paths that 
>> need large allocations from ones that don't. Nearly anything that is exposed 
>> as a JS API or deals with external world can hit sizes over 4Gb. That's not 
>> out of reach in most scenarios, not even for resources loaded from network.
>> 
>> - Alexey
>> 
>> 
>> 19 нояб. 2014 г., в 13:19, Filip Pizlo <fpi...@apple.com 
>> <mailto:fpi...@apple.com>> написал(а):
>> 
>>> ArrayBuffers are very special because they are part of ECMAScript.
>>> 
>>> We use unsigned for the length, because once upon a time, that would have 
>>> been the right type; these days the right type would be a 53-bit integer.  
>>> So, size_t would be wrong.  I believe that ArrayBuffers should be changed 
>>> to use a very special size type; probably it wouldn't even be a primitive 
>>> type but a class that carefully checked that you never overflowed 53 bits.
>>> 
>>> -Filip
>>> 
>>> 
>>>> On Nov 19, 2014, at 12:54 PM, Alexey Proskuryakov <a...@webkit.org 
>>>> <mailto:a...@webkit.org>> wrote:
>>>> 
>>>> 
>>>> This is not exactly about Vector, but if one uses 
>>>> FileReader.prototype.readAsArrayBuffer() on a large file, I think that it 
>>>> overflows ArrayBuffer. WebKit actually crashes when uploading 
>>>> multi-gigabyte files to YouTube, Google Drive and other similar services, 
>>>> although I haven't checked whether it's because of ArrayBuffers, or 
>>>> because of a use of int/unsigned in another code path.
>>>> 
>>>> I think that we should use size_t everywhere except for perhaps a few key 
>>>> places where memory impact is critical (and of course we need explicit 
>>>> checks when casting down to an unsigned). Or perhaps the rule can be even 
>>>> simpler, and unsigned may never be used for indices and sizes, period.
>>>> 
>>>> - Alexey
>>>> 
>>>> 
>>>> 19 нояб. 2014 г., в 12:32, Filip Pizlo <fpi...@apple.com 
>>>> <mailto:fpi...@apple.com>> написал(а):
>>>> 
>>>>> Whatever we do, the clients of Vector should be consistent about what 
>>>>> type they use.  I'm actually fine with Vector internally using unsigned 
>>>>> even if the API uses size_t, but right now we have lots of code that uses 
>>>>> a mix of size_t and unsigned when indexing into Vectors.  That's 
>>>>> confusing.
>>>>> 
>>>>> If I picked one type to use for all Vector indices, it would be unsigned 
>>>>> rather than size_t.  Vector being limited to unsigned doesn't imply 4GB 
>>>>> unless you do Vector<char>.  Usually we have Vectors of pointer-width 
>>>>> things, which means 32GB on 64-bit systems (UINT_MAX * sizeof(void*)).  
>>>>> Even in a world where we had more than 32GB of memory to use within a 
>>>>> single web process, I would hope that we wouldn't use it all on a single 
>>>>> Vector and that if we did, we would treat that one specially for a bunch 
>>>>> of other sensible reasons (among them being that allocating a contiguous 
>>>>> slab of virtual memory of that size is rather taxing).  So, size_t would 
>>>>> buy us almost nothing since if we had a vector grow large enough to need 
>>>>> it, we would be having a bad time already.
>>>>> 
>>>>> I wonder: are there cases that anyone remembers where we have tried to 
>>>>> use Vector to store more than UINT_MAX things?  Another interesting 
>>>>> question is: What's the largest number of things that we store into any 
>>>>> Vector?  We could use such a metric to project how big Vectors might get 
>>>>> in the future.
>>>>> 
>>>>> -Filip
>>>>> 
>>>>> 
>>>>>> On Nov 19, 2014, at 12:20 PM, Chris Dumez <cdu...@apple.com 
>>>>>> <mailto:cdu...@apple.com>> wrote:
>>>>>> 
>>>>>> Hi all,
>>>>>> 
>>>>>> I recently started updating the WTF::Vector API to use unsigned types 
>>>>>> instead of size_t [1][2], because:
>>>>>> - WTF::Vector is already using unsigned type for size/capacity 
>>>>>> internally to save memory on 64-bit, causing a mismatch between the API 
>>>>>> and the internal representation [3]
>>>>>> - Some reviewers have asked me to use unsigned for loop counters 
>>>>>> iterating over vectors (which looks unsafe as the Vector API, e.g. 
>>>>>> size(), returns a size_t).
>>>>>> - I heard from Joseph that this type mismatch is forcing us (and other 
>>>>>> projects using WTF) to disable some build time warnings
>>>>>> - The few people I talked to before making that change said we should do 
>>>>>> it
>>>>>> 
>>>>>> However, Alexey recently raised concerns about this change. it doesn't 
>>>>>> "strike him as the right direction. 4Gb is not much, and we should have 
>>>>>> more of WebKit work with the right data types, not less.”.
>>>>>> I did not initially realize that this change was controversial, but now 
>>>>>> that it seems it is, I thought I would raise the question on webkit-dev 
>>>>>> to see what people think about this.
>>>>>> 
>>>>>> Kr,
>>>>>> --
>>>>>> Chris Dumez - Apple Inc.
>>>>>> Cupertino, CA
>>>>>> 
>>>>>> 
>>>>>> [1] http://trac.webkit.org/changeset/176275 
>>>>>> <http://trac.webkit.org/changeset/176275>
>>>>>> [2] http://trac.webkit.org/changeset/176293 
>>>>>> <http://trac.webkit.org/changeset/176293>
>>>>>> [3] http://trac.webkit.org/changeset/148891 
>>>>>> <http://trac.webkit.org/changeset/148891>
>>>>>> _______________________________________________
>>>>>> webkit-dev mailing list
>>>>>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
>>>>>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>>>>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
>>>>> 
>>>>> _______________________________________________
>>>>> webkit-dev mailing list
>>>>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
>>>>> https://lists.webkit.org/mailman/listinfo/webkit-dev 
>>>>> <https://lists.webkit.org/mailman/listinfo/webkit-dev>
>>>> 
>>>> 
>>> 
>> 
>> 
>> _______________________________________________
>> webkit-dev mailing list
>> webkit-dev@lists.webkit.org <mailto:webkit-dev@lists.webkit.org>
>> https://lists.webkit.org/mailman/listinfo/webkit-dev
> 
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to