OSDN Git Service

CreateSurfaces2: forward function return to caller
authorXu Guangxin <Guangxin.Xu@intel.com>
Wed, 1 Jul 2015 01:49:11 +0000 (09:49 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Tue, 14 Jul 2015 05:56:51 +0000 (13:56 +0800)
we did not check following function's return:
i965_surface_native_memory
i965_suface_external_memory
i965_check_alloc_surface_bo
It will be in trouble if underlay buffer allocation is failed.

src/i965_drv_video.c

index cfaab32..4ba87f8 100644 (file)
@@ -989,9 +989,7 @@ i965_surface_native_memory(VADriverContextP ctx,
         expected_fourcc == VA_FOURCC_YV16)
         tiling = 0;
 
-    i965_check_alloc_surface_bo(ctx, obj_surface, tiling, expected_fourcc, get_sampling_from_fourcc(expected_fourcc));
-
-    return VA_STATUS_SUCCESS;
+    return i965_check_alloc_surface_bo(ctx, obj_surface, tiling, expected_fourcc, get_sampling_from_fourcc(expected_fourcc));
 }
     
 static VAStatus
@@ -1327,19 +1325,23 @@ i965_CreateSurfaces2(
                     }
                 }
             }
-            i965_surface_native_memory(ctx,
-                                       obj_surface,
-                                       format,
-                                       expected_fourcc);
+            vaStatus = i965_surface_native_memory(ctx,
+                                                  obj_surface,
+                                                  format,
+                                                  expected_fourcc);
             break;
 
         case I965_SURFACE_MEM_GEM_FLINK:
         case I965_SURFACE_MEM_DRM_PRIME:
-            i965_suface_external_memory(ctx,
-                                        obj_surface,
-                                        memory_type,
-                                        memory_attibute,
-                                        i);
+            vaStatus = i965_suface_external_memory(ctx,
+                                                   obj_surface,
+                                                   memory_type,
+                                                   memory_attibute,
+                                                   i);
+            break;
+        }
+        if (VA_STATUS_SUCCESS != vaStatus) {
+            i965_destroy_surface(&i965->surface_heap, (struct object_base *)obj_surface);
             break;
         }
     }