On 05/05/15 11:50, Juha-Pekka Heikkila wrote:
If _mesa_hash_table_create failed we'd get null pointer. Report
error and go away.

Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikk...@gmail.com>
---
  src/mesa/main/formats.c | 10 ++++++++++
  1 file changed, 10 insertions(+)

diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index 8af44e9..f7c9402 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -397,6 +397,11 @@ format_array_format_table_init(void)
     format_array_format_table = _mesa_hash_table_create(NULL, NULL,
                                                         array_formats_equal);

+   if (!format_array_format_table) {
+      _mesa_error_no_memory(__func__);
+      return;
+   }
+
     for (f = 1; f < MESA_FORMAT_COUNT; ++f) {
        info = _mesa_get_format_info(f);
        if (!info->ArrayFormat)
@@ -432,6 +437,11 @@ _mesa_format_from_array_format(uint32_t array_format)

     call_once(&format_array_format_table_exists, 
format_array_format_table_init);

+   if (!format_array_format_table) {
+      format_array_format_table_exists = ONCE_FLAG_INIT;

This is not portable, as ONCE_FLAG_INIT is meant to be an initializer expression. In particular it's defined as a structure initializer on Windows "{ 0 }" and is not a valid rvalue expression.

I've just fixed the build, but this still looks like a bad idea:

- the idea of call_once is "calling once", not "keep trying" -- and this usage can easily lead to leaks crashes, etc, depending on how call_once was implemented.

- touching touching format_array_format_table_exists introduces a race condition: imagine another call_once happens when format_array_format_table_exists is being overwritten, and catches half written


I also don't understand what's exactly the problem here. Why would _mesa_hash_table_create() fail? I think it might be better to just abort(), rather than this sort of half-remedies.

Maybe we need a `_mesa_error_no_memory_fatal` or add a `fatal` parameter to `_mesa_error_no_memory`.

Jose
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to