<div dir="ltr"><div><div><div>Notice that git worries about collisions between the 7 char abbreviated sha1s in large repositories, and sometime have to use 10 or 12 chars, etc:<br><a href="https://github.com/blog/2288-git-2-11-has-been-released">https://github.com/blog/2288-git-2-11-has-been-released</a><br></div><br>"This is exactly what happened in the Linux kernel repository; it now has
 over 5 million objects, meaning we'd expect collisions with names 
shorter than 12 hexadecimal characters."<br><br>I think that speaks for itself.<br><br></div>Also, SHA1 is very good at generating a completely different hash for small changes. So to generate a collision with X, you can't have X +/- a few bytes.<br></div><br><div><div>Regards<br></div><div>//Ernst<br></div><div><br><div class="gmail_extra"><br><div class="gmail_quote">2017-02-27 13:20 GMT+01:00 Marek Olšák <span dir="ltr"><<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-HOEnZb"><div class="gmail-h5">On Mon, Feb 27, 2017 at 10:57 AM, Michel Dänzer <<a href="mailto:michel@daenzer.net">michel@daenzer.net</a>> wrote:<br>
> On 25/02/17 01:56 PM, Timothy Arceri wrote:<br>
>> On 24/02/17 21:02, Marek Olšák wrote:<br>
>>> On Fri, Feb 24, 2017 at 3:18 AM, Timothy Arceri<br>
>>> <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>> wrote:<br>
>>>> On 24/02/17 08:49, Timothy Arceri wrote:<br>
>>>>> On 24/02/17 05:12, Marek Olšák wrote:<br>
>>>>>> On Thu, Feb 23, 2017 at 3:09 AM, Timothy Arceri<br>
>>>>>> <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>> wrote:<br>
>>>>>>><br>
>>>>>>> From: kdj0c <<a href="mailto:kdj0c@djinvi.net">kdj0c@djinvi.net</a>><br>
>>>>>>><br>
>>>>>>> V2 (Timothy Arceri):<br>
>>>>>>> - when loading from disk cache also binary insert into memory cache.<br>
>>>>>>> - check that the binary loaded from disk is the correct size. If not<br>
>>>>>>>   delete the cache item and skip loading from cache.<br>
>>>>>>> ---<br>
>>>>>>>  src/gallium/drivers/radeonsi/<wbr>si_state_shaders.c | 69<br>
>>>>>>> ++++++++++++++++++++++---<br>
>>>>>>>  1 file changed, 62 insertions(+), 7 deletions(-)<br>
>>>>>>><br>
>>>>>>> diff --git a/src/gallium/drivers/<wbr>radeonsi/si_state_shaders.c<br>
>>>>>>> b/src/gallium/drivers/<wbr>radeonsi/si_state_shaders.c<br>
>>>>>>> index f615aa8..71556f9 100644<br>
>>>>>>> --- a/src/gallium/drivers/<wbr>radeonsi/si_state_shaders.c<br>
>>>>>>> +++ b/src/gallium/drivers/<wbr>radeonsi/si_state_shaders.c<br>
>>>>>>> @@ -36,6 +36,9 @@<br>
>>>>>>>  #include "util/u_memory.h"<br>
>>>>>>>  #include "util/u_prim.h"<br>
>>>>>>><br>
>>>>>>> +#include "util/disk_cache.h"<br>
>>>>>>> +#include "util/mesa-sha1.h"<br>
>>>>>>> +<br>
>>>>>>>  /* SHADER_CACHE */<br>
>>>>>>><br>
>>>>>>>  /**<br>
>>>>>>> @@ -182,10 +185,12 @@ static bool si_load_shader_binary(struct<br>
>>>>>>> si_shader *shader, void *binary)<br>
>>>>>>>   */<br>
>>>>>>>  static bool si_shader_cache_insert_shader(<wbr>struct si_screen *sscreen,<br>
>>>>>>>                                           void *tgsi_binary,<br>
>>>>>>> -                                         struct si_shader *shader)<br>
>>>>>>> +                                         struct si_shader *shader,<br>
>>>>>>> +                                         bool<br>
>>>>>>> insert_into_disk_cache)<br>
>>>>>>>  {<br>
>>>>>>>         void *hw_binary;<br>
>>>>>>>         struct hash_entry *entry;<br>
>>>>>>> +       uint8_t key[CACHE_KEY_SIZE];<br>
>>>>>>><br>
>>>>>>>         entry = _mesa_hash_table_search(<wbr>sscreen->shader_cache,<br>
>>>>>>> tgsi_binary);<br>
>>>>>>>         if (entry)<br>
>>>>>>> @@ -201,6 +206,12 @@ static bool si_shader_cache_insert_shader(<wbr>struct<br>
>>>>>>> si_screen *sscreen,<br>
>>>>>>>                 return false;<br>
>>>>>>>         }<br>
>>>>>>><br>
>>>>>>> +       if (sscreen->b.disk_shader_cache && insert_into_disk_cache) {<br>
>>>>>>> +               _mesa_sha1_compute(tgsi_<wbr>binary, *((uint32_t<br>
>>>>>>> *)tgsi_binary), key);<br>
>>>>>><br>
>>>>>><br>
>>>>>> What happens if we randomly get a sha1 collision?<br>
>>>>><br>
>>>>><br>
>>>>> You should stop playing your game which will be rendering incorrectly<br>
>>>>> and by a lotto ticket.<br>
>>>>><br>
>>>>>> Shouldn't we store the whole key as well?<br>
>>>>><br>
>>>>><br>
>>>>> Sure I can add that, its cheap to check here anyway. Although the other<br>
>>>>> cache stages rely on a collision being improbable.<br>
>>>><br>
>>>><br>
>>>><br>
>>>> For some reason I thought the key was simpler than it is. It seems<br>
>>>> excessive<br>
>>>> to store and compare the tgsi again. I don't think git even worries<br>
>>>> about<br>
>>>> the possibility of a collision and we will be dealing with much smaller<br>
>>>> amounts of cache items then commits in a git repository.<br>
>>>><br>
>>>> Thoughts?<br>
>>><br>
>>> I'll let others comment on this. If nobody comments, checking only the<br>
>>> key can stay.<br>
>><br>
>> Seems SVN didn't used to worry about collisions either.<br>
>><br>
>> <a href="https://arstechnica.com/security/2017/02/watershed-sha1-collision-just-broke-the-webkit-repository-others-may-follow/" rel="noreferrer" target="_blank">https://arstechnica.com/<wbr>security/2017/02/watershed-<wbr>sha1-collision-just-broke-the-<wbr>webkit-repository-others-may-<wbr>follow/</a><br>
><br>
> What scenario are we concerned about here? Getting a genuine SHA1<br>
> collision between two shader objects is still as unlikely as it ever was<br>
> (virtually impossible?), and someone with access to the shader cache<br>
> files can wreak havoc much more easily than via a hash collision.<br>
<br>
</div></div>I'm concerned about the random scenario where 2 shaders can have the<br>
same hash. That is, if the user doesn't do anything wrong and nobody<br>
else corrupts the cache, can we say for sure that a collision will<br>
never ever happen?<br>
<br>
The patch can land as-is, but the topic is still open.<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
Marek<br>
</font></span><div class="gmail-HOEnZb"><div class="gmail-h5">______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div></div></div></div>