From 5e09ccc8b30c7fba349d2acf191a967d7a2ad60d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 30 May 2017 13:57:18 +0900 Subject: [PATCH 01/16] server: ignore chown & chmod errors Change-Id: I0a923486ca44f8b2b0232bfe4d728a39a66d6df0 --- src/tdm_server.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/tdm_server.c b/src/tdm_server.c index 209429b..bd9cd9f 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -677,7 +677,7 @@ failed: return -1; } -static int +static void _tdm_socket_init(tdm_private_loop *private_loop) { const char *dir = NULL; @@ -686,50 +686,39 @@ _tdm_socket_init(tdm_private_loop *private_loop) uid_t uid; gid_t gid; - if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { - TDM_ERR("createing a tdm-socket failed"); - return 0; - } - dir = getenv("XDG_RUNTIME_DIR"); if (!dir) { - TDM_ERR("getting XDG_RUNTIME_DIR failed"); - return 0; + TDM_WRN("getting XDG_RUNTIME_DIR failed"); + return; } snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, "tdm-socket"); ret = chmod(socket_path, 509); if (ret < 0) { - TDM_ERR("changing modes of socket file failed:%s (%m)", socket_path); - return 0; + TDM_WRN("changing modes of socket file failed:%s (%m)", socket_path); + return; } - /* if not super user, we don't need to change owner and group */ - if (getuid() != 0) - return 1; - ret = _tdm_getgrnam_r("root"); if (ret < 0) { - TDM_ERR("getting uid failed"); - return 0; + TDM_WRN("getting uid failed"); + return; } uid = ret; ret = _tdm_getgrnam_r("display"); if (ret < 0) { - TDM_ERR("getting gid failed"); - return 0; + TDM_WRN("getting gid failed"); + return; } gid = ret; ret = chown(socket_path, uid, gid); if (ret < 0) { - TDM_ERR("changing owner of socket file failed:%s (%m)", socket_path); - return 0; + TDM_WRN("changing owner of socket file failed:%s (%m)", socket_path); + return; } - - return 1; } INTERN tdm_error @@ -743,11 +732,13 @@ tdm_server_init(tdm_private_loop *private_loop) if (private_loop->private_server) return TDM_ERROR_NONE; - if (!_tdm_socket_init(private_loop)) { - TDM_ERR("initializing tdm-socket failed"); + if (wl_display_add_socket(private_loop->wl_display, "tdm-socket")) { + TDM_ERR("createing a tdm-socket failed"); return TDM_ERROR_OPERATION_FAILED; } + _tdm_socket_init(private_loop); + private_server = calloc(1, sizeof * private_server); if (!private_server) { TDM_ERR("alloc failed"); -- 2.7.4 From 2c307332239ee96a93d80b9737b132977db790f6 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 30 May 2017 14:37:17 +0900 Subject: [PATCH 02/16] package version up to 1.6.20 Change-Id: I6aa36f184b3d4e23c9388af1fc89e1d0ea24c11b --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 6fbc3c0..8724a9d 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.19 +Version: 1.6.20 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 1578d492620801adc40404340d546adcb9c76645 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Sun, 11 Jun 2017 08:24:07 +0900 Subject: [PATCH 03/16] helper: add tdm_helper_get_buffer_full_size() to get the real buffer size Change-Id: Ie27d3b52ab57171b25628e8a85fc509d1e643e21 --- include/tdm_helper.h | 11 +++++++++++ src/tdm_helper.c | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index c80057d..ef0a657 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -110,6 +110,17 @@ void tdm_helper_clear_buffer(tbm_surface_h buffer); /** + * @brief Get the buffer full size. + * @details + * In some hardware, the buffer width or height is aligned with the fixed size. + * eg. 8, 16, etc. In this case, the real size of buffer could be bigger than + * the buffer size of tbm_surface_info_s. + * @param[in] buffer A TDM buffer + */ +void +tdm_helper_get_buffer_full_size(tbm_surface_h buffer, int *buffer_w, int *buffer_h); + +/** * @brief convert the source buffer to the destination buffer with given rectangles * trannsform * @details diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 4adbcb8..21758f6 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -390,6 +390,28 @@ tdm_helper_clear_buffer(tbm_surface_h buffer) tdm_helper_clear_buffer_pos(buffer, NULL); } +EXTERN void +tdm_helper_get_buffer_full_size(tbm_surface_h buffer, int *buffer_w, int *buffer_h) +{ + tbm_surface_info_s info; + int ret; + + TDM_RETURN_IF_FAIL(buffer != NULL); + + ret = tbm_surface_get_info(buffer, &info); + TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); + + if (buffer_w) { + if (IS_RGB(info.format)) + *buffer_w = info.planes[0].stride >> 2; + else + *buffer_w = info.planes[0].stride; + } + + if (buffer_h) + *buffer_h = info.planes[0].size / info.planes[0].stride; +} + static pixman_format_code_t _tdm_helper_pixman_format_get(tbm_format format) { -- 2.7.4 From c91a6898749a2445d74ddb4162372e75e0442eec Mon Sep 17 00:00:00 2001 From: Boram Park Date: Sun, 11 Jun 2017 08:25:27 +0900 Subject: [PATCH 04/16] helper: consider the real buffer size Change-Id: I6950f430aa2581c93709c80200f7b60600b56af4 --- src/tdm_helper.c | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 21758f6..90dd618 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -216,7 +216,7 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) tbm_surface_info_s info; const char *ext; char file[TDM_PATH_LEN]; - int ret, bw; + int ret, bw, bh; TDM_RETURN_IF_FAIL(buffer != NULL); TDM_RETURN_IF_FAIL(dir != NULL); @@ -225,16 +225,15 @@ tdm_helper_dump_buffer_str(tbm_surface_h buffer, char *dir, char *str) ret = tbm_surface_get_info(buffer, &info); TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); - if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) { + if (IS_RGB(info.format)) ext = file_exts[0]; - bw = info.planes[0].stride >> 2; - } else { + else ext = file_exts[1]; - bw = info.planes[0].stride; - } - snprintf(file, TDM_PATH_LEN, "%s/%c%c%c%c_%dx%d_%s.%s", - dir, FOURCC_STR(info.format), bw, info.height, str, ext); + tdm_helper_get_buffer_full_size(buffer, &bw, &bh); + + snprintf(file, TDM_PATH_LEN, "%s/%c%c%c%c_%dx%d_%dx%d_%s.%s", + dir, FOURCC_STR(info.format), bw, bh, info.width, info.height, str, ext); tdm_helper_dump_buffer(buffer, file); } @@ -246,6 +245,7 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) int len, ret; const char *ext; int bo_cnt; + int bw, bh; TDM_RETURN_IF_FAIL(buffer != NULL); TDM_RETURN_IF_FAIL(file != NULL); @@ -254,7 +254,7 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) TDM_RETURN_IF_FAIL(ret == TBM_SURFACE_ERROR_NONE); len = strnlen(file, 1024); - if (info.format == TBM_FORMAT_ARGB8888 || info.format == TBM_FORMAT_XRGB8888) + if (IS_RGB(info.format)) ext = file_exts[0]; else ext = file_exts[1]; @@ -265,9 +265,11 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) return; } + tdm_helper_get_buffer_full_size(buffer, &bw, &bh); + bo_cnt = tbm_surface_internal_get_num_bos(buffer); - TDM_DBG("buffer: bo_cnt(%d) %dx%d %c%c%c%c, plane: (%p+%d, %d,%d) (%p+%d, %d,%d) (%p+%d, %d,%d)", - bo_cnt, info.width, info.height, FOURCC_STR(info.format), + TDM_DBG("buffer: bo_cnt(%d) %dx%d(%dx%d) %c%c%c%c, plane: (%p+%d, %d,%d) (%p+%d, %d,%d) (%p+%d, %d,%d)", + bo_cnt, bw, bh, info.width, info.height, FOURCC_STR(info.format), info.planes[0].ptr, info.planes[0].offset, info.planes[0].stride, info.planes[0].size, info.planes[1].ptr, info.planes[1].offset, info.planes[1].stride, info.planes[1].size, info.planes[2].ptr, info.planes[2].offset, info.planes[2].stride, info.planes[2].size); @@ -275,37 +277,32 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) switch (info.format) { case TBM_FORMAT_ARGB8888: case TBM_FORMAT_XRGB8888: - _tdm_helper_dump_png(file, info.planes[0].ptr, - info.planes[0].stride >> 2, info.height); + _tdm_helper_dump_png(file, info.planes[0].ptr, bw, bh); break; case TBM_FORMAT_YVU420: case TBM_FORMAT_YUV420: _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, + info.planes[0].size, info.planes[1].ptr, - info.planes[1].stride * (info.height >> 1), + info.planes[1].size, info.planes[2].ptr, - info.planes[2].stride * (info.height >> 1)); + info.planes[2].size); break; case TBM_FORMAT_NV12: case TBM_FORMAT_NV21: - if (bo_cnt == 1 && - (info.planes[0].ptr + info.planes[0].stride * info.height) != info.planes[1].ptr) - TDM_WRN("%p != %p", info.planes[0].ptr + info.planes[0].stride * info.height, info.planes[1].ptr); - _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, + info.planes[0].size, info.planes[1].ptr, - info.planes[1].stride * (info.height >> 1), NULL, + info.planes[1].size, NULL, 0); break; case TBM_FORMAT_YUYV: case TBM_FORMAT_UYVY: _tdm_helper_dump_raw(file, info.planes[0].ptr, - info.planes[0].stride * info.height, NULL, 0, + info.planes[0].size, NULL, 0, NULL, 0); break; default: -- 2.7.4 From 470a74ebff119bf94799ddfa1d04afdd65c9f16a Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 13 Jun 2017 15:43:42 +0900 Subject: [PATCH 05/16] package version up to 1.6.21 Change-Id: Ia2a26859bdbe445abc36a72c6c6b7a6b04e5e963 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 8724a9d..81b5794 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.20 +Version: 1.6.21 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 799c6b50a1be745398cadad8485f42563fa8b445 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 4 Jul 2017 10:08:12 +0900 Subject: [PATCH 06/16] support tdm_value type Change-Id: I88a97af9c00566cb6d21ce8062fb4d73eb678751 --- include/tdm_common.h | 12 ++++++++++++ include/tdm_types.h | 1 + src/tdm_helper.c | 53 ++++++++++++++++++++++++++++++++++++++++++++-------- src/tdm_macro.h | 9 +++++++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/include/tdm_common.h b/include/tdm_common.h index dc33494..dfb3f8e 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -262,6 +262,18 @@ typedef struct _tdm_pos { } tdm_pos; /** + * @brief The tdm value type enumeration + */ +typedef enum { + TDM_VALUE_TYPE_UNKNOWN, + TDM_VALUE_TYPE_PTR, + TDM_VALUE_TYPE_INT32, + TDM_VALUE_TYPE_UINT32, + TDM_VALUE_TYPE_INT64, + TDM_VALUE_TYPE_UINT64, +} tdm_value_type; + +/** * @brief The value union */ typedef union { diff --git a/include/tdm_types.h b/include/tdm_types.h index 3b62ff5..2cda6d6 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -85,6 +85,7 @@ typedef struct _tdm_output_mode { typedef struct _tdm_prop { unsigned int id; char name[TDM_NAME_LEN]; + tdm_value_type type; } tdm_prop; /** diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 90dd618..aaf7fbd 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -44,6 +44,7 @@ #include #include #include +#include #include "tdm.h" #include "tdm_private.h" @@ -854,7 +855,7 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t%d properties:\n", private_output->caps.prop_count); if (private_output->caps.prop_count > 0) { - TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_output->caps.prop_count; i++) { tdm_value value; TDM_DBG_GOTO_IF_FAIL(func_output->output_get_property, unlock); @@ -862,10 +863,28 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_output->caps.props[i].id, &value); TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - TDM_SNPRINTF(reply, len, "\t\t%s\t%u\t%u\n", + TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_output->caps.props[i].name, - private_output->caps.props[i].id, - value.u32); + tdm_value_type_str(private_output->caps.props[i].type), + private_output->caps.props[i].id); + switch (private_output->caps.props[i].type) { + case TDM_VALUE_TYPE_PTR: + TDM_SNPRINTF(reply, len, "%p\n", value.ptr); + break; + case TDM_VALUE_TYPE_INT32: + TDM_SNPRINTF(reply, len, "%d\n", value.s32); + break; + case TDM_VALUE_TYPE_INT64: + TDM_SNPRINTF(reply, len, "%"PRId64"\n", value.s64); + break; + case TDM_VALUE_TYPE_UINT64: + TDM_SNPRINTF(reply, len, "%"PRIu64"\n", value.u64); + break; + case TDM_VALUE_TYPE_UINT32: + default: + TDM_SNPRINTF(reply, len, "%u\n", value.u32); + break; + } } } } @@ -937,7 +956,7 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t%u properties:\n", private_layer->caps.prop_count); if (private_layer->caps.prop_count > 0) { - TDM_SNPRINTF(reply, len, "\t\tname\tidx\tvalue\n"); + TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_layer->caps.prop_count; i++) { tdm_value value; TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_property, unlock); @@ -945,10 +964,28 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_layer->caps.props[i].id, &value); TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); - TDM_SNPRINTF(reply, len, "\t\t%s\t%u\t%u\n", + TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_layer->caps.props[i].name, - private_layer->caps.props[i].id, - value.u32); + tdm_value_type_str(private_output->caps.props[i].type), + private_layer->caps.props[i].id); + switch (private_layer->caps.props[i].type) { + case TDM_VALUE_TYPE_PTR: + TDM_SNPRINTF(reply, len, "%p\n", value.ptr); + break; + case TDM_VALUE_TYPE_INT32: + TDM_SNPRINTF(reply, len, "%d\n", value.s32); + break; + case TDM_VALUE_TYPE_INT64: + TDM_SNPRINTF(reply, len, "%"PRId64"\n", value.s64); + break; + case TDM_VALUE_TYPE_UINT64: + TDM_SNPRINTF(reply, len, "%"PRIu64"\n", value.u64); + break; + case TDM_VALUE_TYPE_UINT32: + default: + TDM_SNPRINTF(reply, len, "%u\n", value.u32); + break; + } } } } diff --git a/src/tdm_macro.h b/src/tdm_macro.h index f377fae..6da02b4 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -219,6 +219,15 @@ static struct tdm_type_name tdm_transform_names[] = { }; TDM_TYPE_NAME_FN(transform) +static struct tdm_type_name tdm_value_type_names[] = { + { TDM_VALUE_TYPE_UNKNOWN, "unknown" }, + { TDM_VALUE_TYPE_PTR, "ptr" }, + { TDM_VALUE_TYPE_INT32, "int32" }, + { TDM_VALUE_TYPE_UINT32, "uint32" }, + { TDM_VALUE_TYPE_INT64, "int64" }, + { TDM_VALUE_TYPE_UINT64, "uint64" }, +}; +TDM_TYPE_NAME_FN(value_type) #define TDM_BIT_NAME_FB(res) \ static inline const char * tdm_##res##_str(int type, char **reply, int *len) \ -- 2.7.4 From d34126b79357c9828d4b22fc91345c6c7b9c3ff8 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 5 Jul 2017 10:35:32 +0900 Subject: [PATCH 07/16] package version up to 1.7.0 Change-Id: I16fa39bb01c3547de50988e47794546578d6331c --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 81b5794..3bc43e4 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.6.21 +Version: 1.7.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 0e06e36a5d1f0461697a0449f8c7e747fa450481 Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Tue, 11 Jul 2017 13:34:58 +0900 Subject: [PATCH 08/16] log: use public wayland api remove useless code for protocol log. Change-Id: Ide45ca176c8998f604f8f55664271a1c89d5208b --- src/tdm_event_loop.c | 98 ++-------------------------------------------------- src/tdm_private.h | 20 ----------- 2 files changed, 2 insertions(+), 116 deletions(-) diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c index 7445ad5..c947243 100644 --- a/src/tdm_event_loop.c +++ b/src/tdm_event_loop.c @@ -532,91 +532,6 @@ _trace_get_next_argument(const char *signature, return signature; } -#if !TDM_WAYLAND_LOGGER - -static void -_trace_protocol_cb(struct wl_closure *closure, struct wl_resource *resource, int send) -{ - int i; - struct argument_details arg; - struct wl_object *object = &resource->object; - struct wl_client *client = resource->client; - const char *signature = closure->message->signature; - struct timespec tp; - unsigned int time; - pid_t pid = -1; - const char *proc_name; - char temp[512] = { 0, }, *p = temp; - int len = sizeof(temp), *l = &len; - - if (client) { - _trace_reg_client_destroy_listener(client); - wl_client_get_credentials(client, &pid, NULL, NULL); - } - - proc_name = tdm_server_get_client_name(pid); - - clock_gettime(CLOCK_MONOTONIC, &tp); - time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000); - - TDM_SNPRINTF(p, l, "[%10.3f] %s%d%s%s@%u.%s(", - time / 1000.0, - send ? "Server -> Client [PID:" : "Server <- Client [PID:", - pid, "] ", - object->interface->name, object->id, closure->message->name); - - for (i = 0; i < closure->count; i++) { - signature = _trace_get_next_argument(signature, &arg); - TDM_RETURN_IF_FAIL(signature != NULL); - - if (i > 0) - TDM_SNPRINTF(p, l, ", "); - - switch (arg.type) { - case 'u': - TDM_SNPRINTF(p, l, "%u", closure->args[i].u); - break; - case 'i': - TDM_SNPRINTF(p, l, "%d", closure->args[i].i); - break; - case 'f': - TDM_SNPRINTF(p, l, "%f", wl_fixed_to_double(closure->args[i].f)); - break; - case 's': - TDM_SNPRINTF(p, l, "\"%s\"", closure->args[i].s); - break; - case 'o': - if (closure->args[i].o) - TDM_SNPRINTF(p, l, "%s@%u", closure->args[i].o->interface->name, closure->args[i].o->id); - else - TDM_SNPRINTF(p, l, "nil"); - break; - case 'n': - TDM_SNPRINTF(p, l, "new id %s@", - (closure->message->types[i]) ? closure->message->types[i]->name : "[unknown]"); - if (closure->args[i].n != 0) - TDM_SNPRINTF(p, l, "%u", closure->args[i].n); - else - TDM_SNPRINTF(p, l, "nil"); - break; - case 'a': - TDM_SNPRINTF(p, l, "array"); - break; - case 'h': - TDM_SNPRINTF(p, l, "fd %d", closure->args[i].h); - break; - default: - return; - } - } - - TDM_SNPRINTF(p, l, "), cmd: %s", proc_name ? proc_name : "Unknown"); - - TDM_INFO("%s", temp); -} - -#else - static struct wl_protocol_logger *_trace_protocol_logger; static void @@ -652,7 +567,7 @@ _trace_protocol_logger_cb(void *user_data, time / 1000.0, send ? "Server -> Client [PID:" : "Server <- Client [PID:", pid, "] ", - wl_resource_get_name(message->resource), + wl_resource_get_class(message->resource), wl_resource_get_id(message->resource), message->message->name); @@ -680,7 +595,7 @@ _trace_protocol_logger_cb(void *user_data, case 'o': if (message->arguments[i].o) TDM_SNPRINTF(p, l, "%s@%u", - wl_resource_get_name((struct wl_resource *) message->arguments[i].o), + wl_resource_get_class((struct wl_resource *) message->arguments[i].o), wl_resource_get_id((struct wl_resource *) message->arguments[i].o)); else TDM_SNPRINTF(p, l, "nil"); @@ -708,7 +623,6 @@ _trace_protocol_logger_cb(void *user_data, TDM_INFO("%s", temp); } -#endif INTERN tdm_error tdm_event_loop_trace_enable(tdm_private_display * private_display, @@ -719,26 +633,18 @@ tdm_event_loop_trace_enable(tdm_private_display * private_display, TDM_RETURN_VAL_IF_FAIL(private_loop->wl_display != NULL, TDM_ERROR_NONE); if (!enable) { -#if !TDM_WAYLAND_LOGGER - wl_debug_server_debug_func_set(NULL); -#else if (_trace_protocol_logger) { wl_protocol_logger_destroy(_trace_protocol_logger); _trace_protocol_logger = NULL; } -#endif return TDM_ERROR_NONE; } -#if !TDM_WAYLAND_LOGGER - wl_debug_server_debug_func_set((wl_server_debug_func_ptr) _trace_protocol_cb); -#else if (_trace_protocol_logger) wl_protocol_logger_destroy(_trace_protocol_logger); _trace_protocol_logger = wl_display_add_protocol_logger(private_loop->wl_display, _trace_protocol_logger_cb, NULL); -#endif return TDM_ERROR_NONE; } diff --git a/src/tdm_private.h b/src/tdm_private.h index 25b24b7..4ea122d 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -696,26 +696,6 @@ void tdm_monitor_server_command(tdm_display *dpy, const char *options, char *reply, int *len); - -#define TDM_WAYLAND_LOGGER ((WAYLAND_VERSION_MAJOR == 1) && (WAYLAND_VERSION_MINOR > 11)) - -#if !TDM_WAYLAND_LOGGER -#ifndef WL_CLOSURE_MAX_ARGS -#define WL_CLOSURE_MAX_ARGS 20 -#endif - -struct wl_closure { - int count; - const struct wl_message *message; - uint32_t opcode; - uint32_t sender_id; - union wl_argument args[WL_CLOSURE_MAX_ARGS]; - struct wl_list link; - struct wl_proxy *proxy; - struct wl_array extra[0]; -}; -#endif /* TDM_WAYLAND_LOGGER */ - struct argument_details { char type; int nullable; -- 2.7.4 From 96cda783ee08e0565a4ca5ef82ed97558feb68c0 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 6 Jul 2017 11:42:23 +0900 Subject: [PATCH 09/16] increase version to 1.7.0 Change-Id: I69d8bc1d44f992e66a097e6aae7569e13e6df194 --- configure.ac | 2 +- doc/tdm_doc.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index ddd144a..a4cb6b8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_PREREQ([2.60]) m4_define([tdm_major_version], [1]) -m4_define([tdm_minor_version], [6]) +m4_define([tdm_minor_version], [7]) m4_define([tdm_micro_version], [0]) m4_define([tdm_version], [tdm_major_version.tdm_minor_version.tdm_micro_version]) diff --git a/doc/tdm_doc.h b/doc/tdm_doc.h index 35d9ee9..1d3e915 100644 --- a/doc/tdm_doc.h +++ b/doc/tdm_doc.h @@ -39,7 +39,7 @@ /** * @mainpage TDM * @author Boram Park, boram1288.park@samsung.com - * @version 1.6.0 + * @version 1.7.0 * @par Introduction * TDM stands for Tizen Display Manager. It's the display HAL layer for tizen * display server. It offers the frontend APIs(@ref tdm.h) for a frontend user -- 2.7.4 From 7f8c3b416f50b7a13d22f79cfc813d5ef8c34d79 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 12:23:44 +0900 Subject: [PATCH 10/16] add tdm_output_set_dpms_async Change-Id: I9775ea2e5e78e8a4b11ec85b2b7481b670959b13 --- include/tdm.h | 19 +++++++++- include/tdm_backend.h | 25 +++++++++++--- src/tdm_output.c | 96 ++++++++++++++++++++++++++++++++++++++++----------- src/tdm_private.h | 1 + 4 files changed, 115 insertions(+), 26 deletions(-) diff --git a/include/tdm.h b/include/tdm.h index 29c8193..a7695c1 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -524,15 +524,32 @@ tdm_error tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode); /** - * @brief Set DPMS of a output object + * @brief Set DPMS of a output object synchronously * @param[in] output A output object * @param[in] dpms_value DPMS value * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see tdm_output_set_dpms_async */ tdm_error tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value); /** + * @brief Set DPMS of a output object asynchronously + * @details This function can be used when a output supports the asynchronous DPMS + * control. The output has #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS flags which + * #tdm_output_get_capabilities returns. If an output change handler is added with + * #tdm_output_add_change_handler, the output change handler will be called when + * the DPMS status is changed indeed. + * @param[in] output A output object + * @param[in] dpms_value DPMS value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see tdm_output_add_change_handler, tdm_output_set_dpms, + * tdm_output_get_capabilities, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS. + */ +tdm_error +tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value); + +/** * @brief Get DPMS of a output object * @param[in] output A output object * @param[out] dpms_value DPMS value diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 0949372..2de8c7b 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -451,7 +451,7 @@ typedef struct _tdm_func_output { tdm_output_commit_handler func); /** - * @brief Set DPMS of a output object + * @brief Set DPMS of a output object synchronously * @param[in] output A output object * @param[in] dpms_value DPMS value * @return #TDM_ERROR_NONE if success. Otherwise, error value. @@ -512,18 +512,35 @@ typedef struct _tdm_func_output { /** * @brief Set a output dpms handler - * @details A backend module needs to call the output dpms handler when the - * output DPMS has been changed to let the TDM frontend know the change. + * @details This function can be NULL if an output doesn't support asynchronous + * DPMS control. Otherwise, a backend module needs to call the output dpms handler + * to let the TDM frontend know the output DPMS change indeed. * @param[in] output A output object * @param[in] func A output dpms handler * @param[in] user_data The user data * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #output_set_dpms_async, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS * @since 1.4.0 */ tdm_error (*output_set_dpms_handler)(tdm_output *output, tdm_output_dpms_handler func, void *user_data); - void (*reserved2)(void); + + /** + * @brief Set DPMS of a output object asynchronously + * @param[in] output A output object + * @details This function can be NULL if an output doesn't support asynchronous + * DPMS control. Otherwise, an output should have #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS + * flags which #output_get_capability returns. And if a output dpms handler is added with + * #output_set_dpms_handler, a backend module needs to call the output dpms handler + * to let the TDM frontend know the output DPMS change indeed. + * @param[in] dpms_value DPMS value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #output_set_dpms_handler, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS + * @since 1.7.0 + */ + tdm_error (*output_set_dpms_async)(tdm_output *output, tdm_output_dpms dpms_value); + void (*reserved3)(void); void (*reserved4)(void); void (*reserved5)(void); diff --git a/src/tdm_output.c b/src/tdm_output.c index 62ba065..8b7abd4 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1087,6 +1087,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ } private_output->current_dpms_value = dpms; + private_output->waiting_dpms_change = 0; TDM_INFO("output(%d) dpms %s", private_output->pipe, tdm_dpms_str(dpms)); @@ -1108,6 +1109,12 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) _pthread_mutex_lock(&private_display->lock); + if (private_output->waiting_dpms_change) { + TDM_ERR("DPMS is not changed yet. Can't be changed twice"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + if (private_output->current_dpms_value == dpms_value) { _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_NONE; @@ -1132,30 +1139,16 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) func_output = &private_display->func_output; - if (!func_output->output_set_dpms) { - _pthread_mutex_unlock(&private_display->lock); - private_output->current_dpms_value = dpms_value; - TDM_INFO("output(%d) dpms %s", private_output->pipe, tdm_dpms_str(dpms_value)); + if (func_output->output_set_dpms) + ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); + else { + ret = TDM_ERROR_NONE; TDM_WRN("not implemented!!"); - return TDM_ERROR_NONE; + goto done; } - if (func_output->output_set_dpms_handler) { - if (!private_output->regist_dpms_cb) { - private_output->regist_dpms_cb = 1; - ret = func_output->output_set_dpms_handler(private_output->output_backend, - tdm_output_cb_dpms, private_output); - if (ret != TDM_ERROR_NONE) { - _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("Can't set the dpms handler!!"); - return ret; - } - } - } - - ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); - - if (ret == TDM_ERROR_NONE && !func_output->output_set_dpms_handler) { +done: + if (ret == TDM_ERROR_NONE) { tdm_value value; private_output->current_dpms_value = dpms_value; @@ -1179,6 +1172,67 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) return ret; } +EXTERN tdm_error +tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) +{ + tdm_func_output *func_output; + OUTPUT_FUNC_ENTRY(); + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS)) { + TDM_ERR("output doesn't support the asynchronous DPMS control!"); + return TDM_ERROR_BAD_REQUEST; + } + + if (dpms_value > TDM_OUTPUT_DPMS_OFF) + dpms_value = TDM_OUTPUT_DPMS_OFF; + + _pthread_mutex_lock(&private_display->lock); + + if (private_output->waiting_dpms_change) { + TDM_ERR("DPMS is not changed yet. Can't be changed twice"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + if (private_output->current_dpms_value == dpms_value) { + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NONE; + } + + func_output = &private_display->func_output; + if (!func_output->output_set_dpms_handler) { + TDM_ERR("not implemented: output_set_dpms_handler"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + if (!func_output->output_set_dpms_async) { + TDM_ERR("not implemented: output_set_dpms_async"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + if (!private_output->regist_dpms_cb) { + private_output->regist_dpms_cb = 1; + ret = func_output->output_set_dpms_handler(private_output->output_backend, + tdm_output_cb_dpms, private_output); + if (ret != TDM_ERROR_NONE) { + _pthread_mutex_unlock(&private_display->lock); + TDM_ERR("Can't set the dpms handler!!"); + return ret; + } + } + + ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value); + + if (ret == TDM_ERROR_NONE) + private_output->waiting_dpms_change = 1; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + INTERN tdm_error tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) { diff --git a/src/tdm_private.h b/src/tdm_private.h index 4ea122d..12ac385 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -193,6 +193,7 @@ struct _tdm_private_output { unsigned int pipe; tdm_output_dpms current_dpms_value; + unsigned int waiting_dpms_change; const tdm_output_mode *current_mode; int regist_vblank_cb; -- 2.7.4 From 9af4e72354e3c50b9d35081875e5074fbf329003 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 14:06:34 +0900 Subject: [PATCH 11/16] fix invariant result Change-Id: Iecb805dfda52036b6bf9a37bb9af994dbe2979d8 --- src/tdm_helper.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index aaf7fbd..712a9da 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -548,7 +548,7 @@ tdm_helper_get_fd(const char *env) if (!value) return -1; - const long sl = strtol(value, &end, 10); + const long int sl = strtol(value, &end, 10); if (end == value) { TDM_ERR("%s: not a decimal number\n", value); return -1; @@ -558,10 +558,10 @@ tdm_helper_get_fd(const char *env) } else if ((sl == LONG_MIN || sl == LONG_MAX) && errno == ERANGE) { TDM_ERR("%s out of range of type long\n", value); return -1; - } else if (sl > INT_MAX) { + } else if (sl >= INT_MAX) { TDM_ERR("%ld greater than INT_MAX\n", sl); return -1; - } else if (sl < INT_MIN) { + } else if (sl <= INT_MIN) { TDM_ERR("%ld less than INT_MIN\n", sl); return -1; } else { -- 2.7.4 From 456f771e2280747215eaf149663391a4578110b6 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 14:36:16 +0900 Subject: [PATCH 12/16] package version up to 1.7.1 Change-Id: Ie7163eaa657b052afe4be96e7e46ad02b54fb295 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 3bc43e4..8e36bee 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.0 +Version: 1.7.1 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 584eccca95f5dbe7d7f5caa5e70443a6970b2eea Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 19 Jul 2017 15:10:06 +0900 Subject: [PATCH 13/16] lock/unlock when calling a tdm_output internal function Change-Id: I0b3e4023f79309fd276142a9706e6ade564e001c --- src/tdm_layer.c | 1 + src/tdm_output.c | 2 ++ src/tdm_vblank.c | 11 +++++++++++ 3 files changed, 14 insertions(+) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 9897c5c..6f7b16c 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -870,6 +870,7 @@ tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_hand tdm_private_layer_commit_handler *lm = NULL, *lmm = NULL; TDM_RETURN_IF_FAIL(private_layer != NULL); + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->layer_commit_handler_list, link) { if (lm->func == func && lm->user_data == user_data) { diff --git a/src/tdm_output.c b/src/tdm_output.c index 8b7abd4..f6d780a 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -810,6 +810,7 @@ tdm_output_remove_vblank_handler_internal(tdm_output *output, tdm_output_vblank_ tdm_private_vblank_handler *v = NULL; TDM_RETURN_IF_FAIL(private_output != NULL); + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); LIST_FOR_EACH_ENTRY(v, &private_output->vblank_handler_list, link) { if (v->func == func && v->user_data == user_data) { @@ -828,6 +829,7 @@ tdm_output_remove_commit_handler_internal(tdm_output *output, tdm_output_commit_ tdm_private_output_commit_handler *c = NULL; TDM_RETURN_IF_FAIL(private_output != NULL); + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); LIST_FOR_EACH_ENTRY(c, &private_output->output_commit_handler_list, link) { if (c->func == func && c->user_data == user_data) { diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index cb21a0c..88a5084 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -277,7 +277,11 @@ _tdm_vblank_change_to_SW(tdm_private_vblank *private_vblank) LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); + + tdm_display_lock(private_vblank->dpy); tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); + tdm_display_unlock(private_vblank->dpy); + w->type = VBLANK_TYPE_SW_FAKE; _tdm_vblank_wait_SW(w); } @@ -291,7 +295,10 @@ _tdm_vblank_free_HW_wait(tdm_private_vblank *private_vblank, tdm_error error, un LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); + + tdm_display_lock(private_vblank->dpy); tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); + tdm_display_unlock(private_vblank->dpy); if (call_cb && w->func) w->func(private_vblank, error, 0, 0, 0, w->user_data); @@ -1075,7 +1082,11 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, if (ret != TDM_ERROR_NONE) { LIST_DEL(&wait_info->link); _tdm_vblank_valid_list_del(&wait_info->valid_link); + + tdm_display_lock(private_vblank->dpy); tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, wait_info); + tdm_display_unlock(private_vblank->dpy); + free(wait_info); return ret; } -- 2.7.4 From 472317e7ef4c44ffeb6abd60144a1cd5e953ee42 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 21 Jul 2017 16:09:57 +0900 Subject: [PATCH 14/16] lock/unlock outside of the helper function Change-Id: I58ffefedb39143391a62a3f9526dea09256f647b --- src/tdm_helper.c | 20 ++++++++------------ src/tdm_monitor_server.c | 2 ++ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 712a9da..cf05aa0 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -789,7 +789,6 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) private_display = dpy; func_output = &private_display->func_output; func_layer = &private_display->func_layer; - _pthread_mutex_lock(&private_display->lock); /* module information */ module_data = private_display->module_data; @@ -825,9 +824,9 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) if (private_output->caps.mode_count > 0) { const tdm_output_mode *current_mode = NULL; - TDM_DBG_GOTO_IF_FAIL(func_output->output_get_mode, unlock); + TDM_DBG_RETURN_IF_FAIL(func_output->output_get_mode); ret = func_output->output_get_mode(private_output->output_backend, ¤t_mode); - TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); TDM_SNPRINTF(reply, len, "\t\t name refresh (Hz) clk hdisp hss hse htot vdisp vss vse vtot vscan\n"); for (i = 0; i < private_output->caps.mode_count; i++) { @@ -858,11 +857,11 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_output->caps.prop_count; i++) { tdm_value value; - TDM_DBG_GOTO_IF_FAIL(func_output->output_get_property, unlock); + TDM_DBG_RETURN_IF_FAIL(func_output->output_get_property); ret = func_output->output_get_property(private_output->output_backend, private_output->caps.props[i].id, &value); - TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_output->caps.props[i].name, tdm_value_type_str(private_output->caps.props[i].type), @@ -903,10 +902,10 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) tdm_size size; tbm_surface_info_s buf_info; - TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_info, unlock); + TDM_DBG_RETURN_IF_FAIL(func_layer->layer_get_info); memset(&info, 0, sizeof info); ret = func_layer->layer_get_info(private_layer->layer_backend, &info); - TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); if (!private_layer->showing_buffer) continue; @@ -959,11 +958,11 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "\t\tname\ttype\tidx\tvalue\n"); for (i = 0; i < private_layer->caps.prop_count; i++) { tdm_value value; - TDM_DBG_GOTO_IF_FAIL(func_layer->layer_get_property, unlock); + TDM_DBG_RETURN_IF_FAIL(func_layer->layer_get_property); ret = func_layer->layer_get_property(private_layer->layer_backend, private_layer->caps.props[i].id, &value); - TDM_DBG_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, unlock); + TDM_DBG_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); TDM_SNPRINTF(reply, len, "\t\t%s\t%s\t%u\t", private_layer->caps.props[i].name, tdm_value_type_str(private_output->caps.props[i].type), @@ -1074,9 +1073,6 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len) TDM_SNPRINTF(reply, len, "[No Capture capability]\n"); } TDM_SNPRINTF(reply, len, "\n"); - -unlock: - _pthread_mutex_unlock(&private_display->lock); } EXTERN int diff --git a/src/tdm_monitor_server.c b/src/tdm_monitor_server.c index c46d457..e7844a5 100644 --- a/src/tdm_monitor_server.c +++ b/src/tdm_monitor_server.c @@ -50,7 +50,9 @@ static void _tdm_monitor_server_usage(char *app_name, char *reply, int *len); static void _tdm_monitor_server_query(unsigned int pid, char *cwd, int argc, char *argv[], char *reply, int *len, tdm_display *dpy) { + tdm_display_lock(dpy); tdm_helper_get_display_information(dpy, reply, len); + tdm_display_unlock(dpy); } static void -- 2.7.4 From cfd952b7abd487a592e2c625f5f37f439f324193 Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Fri, 21 Jul 2017 13:44:23 +0900 Subject: [PATCH 15/16] dump: add function to check whether file is link or not According to security code guide, before open the file for write it should be check the file is symbolic link. Change-Id: I11e5be6898640995669c470cec703aef93869bfd --- src/tdm_helper.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index cf05aa0..947d41e 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -68,12 +68,40 @@ tdm_helper_get_time(void) return 0; } +static int +_tdm_helper_check_file_is_valid(const char* path, int del_link) +{ + char *real_path; + + if (!path) + return 0; + + real_path = realpath(path, NULL); + if (real_path && strncmp(path, real_path, strlen(path))) { + if (del_link) + unlink(path); + free(real_path); + + return 0; + } + + if (real_path) + free(real_path); + + return 1; +} + static void _tdm_helper_dump_raw(const char *file, void *data1, int size1, void *data2, int size2, void *data3, int size3) { unsigned int *blocks; - FILE *fp = fopen(file, "w+"); + FILE *fp; + + if (!_tdm_helper_check_file_is_valid(file, 1)) + TDM_WRN("'%s' may be symbolic link\n", file); + + fp = fopen(file, "w+"); TDM_RETURN_IF_FAIL(fp != NULL); blocks = (unsigned int *)data1; @@ -96,7 +124,12 @@ static void _tdm_helper_dump_png(const char *file, const void *data, int width, int height) { - FILE *fp = fopen(file, "wb"); + FILE *fp; + + if (!_tdm_helper_check_file_is_valid(file, 1)) + TDM_WRN("'%s' may be symbolic link\n", file); + + fp = fopen(file, "wb"); TDM_RETURN_IF_FAIL(fp != NULL); png_structp pPngStruct = -- 2.7.4 From 1cf266db18d48f68aaf8b3606e705c05e749eaad Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 24 Jul 2017 09:34:15 +0900 Subject: [PATCH 16/16] package version up to 1.7.2 Change-Id: I1131954ba752ae4d6d2fc9e5bb79483e99015e63 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 8e36bee..803beff 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.1 +Version: 1.7.2 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4