e_plane_renderer: Fixed crash when copying image to GEM buffer using openmp. 03/96903/2
authorGwanglim Lee <gl77.lee@samsung.com>
Thu, 10 Nov 2016 13:53:42 +0000 (22:53 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Fri, 11 Nov 2016 02:13:44 +0000 (18:13 -0800)
If destination GEM buffer is not page-aligned (4KB), SIGBUS could occur.

Change-Id: I750498862f6b2a533c48e3daa9d86f2d9ad7b2c7

src/bin/e_plane_renderer.c

index 211999f46e5889d7a81cd3d521aca8befa5d952a..301889eab337b879878f49c0e0415fac0189dc2c 100644 (file)
@@ -162,10 +162,12 @@ _e_plane_renderer_client_copied_surface_create(E_Client *ec, Eina_Bool refresh)
    /* copy from src to dst */
 #if HAVE_LIBGOMP
 # define LIBGOMP_COPY_THREAD_NUM 4
-   if (src_info.planes[0].size > LIBGOMP_COPY_THREAD_NUM)
+# define LIBGOMP_COPY_PAGE_SIZE getpagesize()
+# define PAGE_ALIGN(addr) ((addr)&(~((LIBGOMP_COPY_PAGE_SIZE)-1)))
+   if (src_info.planes[0].size > (LIBGOMP_COPY_THREAD_NUM * LIBGOMP_COPY_PAGE_SIZE))
      {
         size_t step[2];
-        step[0] = src_info.planes[0].size / LIBGOMP_COPY_THREAD_NUM;
+        step[0] = PAGE_ALIGN(src_info.planes[0].size / LIBGOMP_COPY_THREAD_NUM);
         step[1] = src_info.planes[0].size - (step[0] * (LIBGOMP_COPY_THREAD_NUM - 1));
 
         omp_set_num_threads(LIBGOMP_COPY_THREAD_NUM);