Add magic num to check sink handle integrity 12/124312/2 accepted/tizen/unified/20170411.164407 submit/tizen/20170411.063046
authorSeokHoon Lee <andy.shlee@samsung.com>
Tue, 11 Apr 2017 06:15:55 +0000 (15:15 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Tue, 11 Apr 2017 06:18:19 +0000 (15:18 +0900)
- Add magic to check handle pointer.
- Add OUT_OF_MEMORY error in case of WFD_NO_FREE_SPACE.

Signed-off-by: SeokHoon Lee <andy.shlee@samsung.com>
Change-Id: Iaf6e36770964c36bfbbc6904232445bc45f8e477

include/scmirroring_private.h
packaging/capi-media-screen-mirroring.spec
src/scmirroring_sink.c

index ba76c2e2d3127be755084142f89f0c046885820a..4ac4aff8d2b442388919e53ba000d18bb72d9549 100644 (file)
@@ -48,6 +48,8 @@ extern "C" {
 #define FONT_COLOR_CYAN     "\033[36m"
 #define FONT_COLOR_GRAY     "\033[37m"
 
+#define SCMIRRORING_MAGIC_NUMBER 0xdeadbeef
+
 #define scmirroring_debug(fmt, arg...) do { \
                LOGD(FONT_COLOR_RESET""fmt"", ##arg);     \
        } while (0)
@@ -136,6 +138,7 @@ typedef struct {
        char *port;
        bool use_hdcp;
        scmirroring_sink_state_cb_s *scmirroring_sink_state_cb;
+       unsigned int magic_num;
 } scmirroring_sink_s;
 
 #define WIFIDIRECT_DISPLAY_FEATURE "http://tizen.org/feature/network.wifi.direct.display"
index 3d5cdb72079441ba89eae882e4fd372b57413a3d..d779a88c35ca4b88b6a1c8e4ea383f655c1e49af 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-screen-mirroring
 Summary:    A screen mirroring library in Tizen C API
-Version:    0.1.69
+Version:    0.1.70
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index f56c138d19fbe9e87c699adea409e3483412593f..0299d48e7a9ca929ccf9e6032734906a87efcec7 100644 (file)
@@ -29,6 +29,11 @@ static scmirroring_error_e __scmirroring_sink_error_convert(const char *func, in
                errorstr = "ERROR_NONE";
                break;
 
+       case MM_ERROR_WFD_NO_FREE_SPACE:
+               ret = SCMIRRORING_ERROR_OUT_OF_MEMORY;
+               errorstr = "OUT_OF_MEMORY";
+               break;
+
        case MM_ERROR_WFD_NOT_INITIALIZED:
        case MM_ERROR_COMMON_INVALID_ATTRTYPE:
        case MM_ERROR_COMMON_INVALID_PERMISSION:
@@ -109,6 +114,9 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink)
 
        scmirroring_retvm_if(scmirroring_sink == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
 
+       scmirroring_sink_s *mhandle = (scmirroring_sink_s *)scmirroring_sink;
+       scmirroring_retvm_if(mhandle->magic_num == SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is created already");
+
        scmirroring_sink_s *handle = (scmirroring_sink_s *)calloc(1, sizeof(scmirroring_sink_s));
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_OUT_OF_MEMORY, "Fail to allocate memory for handle");
 
@@ -117,6 +125,7 @@ int scmirroring_sink_create(scmirroring_sink_h *scmirroring_sink)
        handle->port = NULL;
        handle->use_hdcp = TRUE;
        handle->scmirroring_sink_state_cb = NULL;
+       handle->magic_num = SCMIRRORING_MAGIC_NUMBER;
 
        ret = mm_wfd_sink_create(&handle->mm_handle);
        if (ret != MM_ERROR_NONE) {
@@ -143,6 +152,7 @@ int scmirroring_sink_set_ip_and_port(scmirroring_sink_h scmirroring_sink, const
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
        scmirroring_retvm_if(ip == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "ip is NULL");
        scmirroring_retvm_if(port == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "port is NULL");
 
@@ -167,6 +177,7 @@ int scmirroring_sink_prepare(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_prepare(handle->mm_handle);
 
@@ -189,6 +200,7 @@ int scmirroring_sink_connect(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        if (handle->ip == NULL) {
                scmirroring_error("INVALID_IP(NULL) (0x%08x)", SCMIRRORING_ERROR_INVALID_PARAMETER);
@@ -226,6 +238,7 @@ int scmirroring_sink_unprepare(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_unprepare(handle->mm_handle);
 
@@ -247,10 +260,12 @@ int scmirroring_sink_destroy(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_destroy(handle->mm_handle);
 
        handle->mm_handle = 0;
+       handle->magic_num = 0;
        SCMIRRORING_SAFE_FREE(handle->ip);
        SCMIRRORING_SAFE_FREE(handle->port);
        SCMIRRORING_SAFE_FREE(handle->scmirroring_sink_state_cb);
@@ -274,6 +289,7 @@ int scmirroring_sink_start(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_start(handle->mm_handle);
 
@@ -295,6 +311,7 @@ int scmirroring_sink_disconnect(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_disconnect(handle->mm_handle);
 
@@ -316,6 +333,7 @@ int scmirroring_sink_set_state_changed_cb(scmirroring_sink_h scmirroring_sink, s
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
        scmirroring_retvm_if(callback == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "callback is NULL");
 
        if (handle->scmirroring_sink_state_cb == NULL) {
@@ -351,6 +369,7 @@ int scmirroring_sink_unset_state_changed_cb(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_set_message_callback(handle->mm_handle, NULL, NULL);
 
@@ -374,6 +393,7 @@ int scmirroring_sink_set_display(scmirroring_sink_h scmirroring_sink, scmirrorin
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
        scmirroring_retvm_if(display_surface == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "display_surface is NULL");
 
        if ((type != SCMIRRORING_DISPLAY_TYPE_OVERLAY) && (type != SCMIRRORING_DISPLAY_TYPE_EVAS)) {
@@ -419,6 +439,8 @@ int scmirroring_sink_set_resolution(scmirroring_sink_h scmirroring_sink, int res
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
+
        if ((resolution < SCMIRRORING_RESOLUTION_1920x1080_P30) || (resolution >= SCMIRRORING_RESOLUTION_MAX)) {
                scmirroring_error("Invalid resolution : %d", resolution);
                return SCMIRRORING_ERROR_INVALID_PARAMETER;
@@ -449,6 +471,7 @@ int scmirroring_sink_pause(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_pause(handle->mm_handle);
 
@@ -470,6 +493,7 @@ int scmirroring_sink_resume(scmirroring_sink_h scmirroring_sink)
        scmirroring_debug_fenter();
 
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        ret = mm_wfd_sink_resume(handle->mm_handle);
 
@@ -495,6 +519,7 @@ int scmirroring_sink_get_negotiated_video_codec(scmirroring_sink_h *scmirroring_
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *codec = SCMIRRORING_VIDEO_CODEC_NONE;
 
@@ -533,6 +558,7 @@ int scmirroring_sink_get_negotiated_video_resolution(scmirroring_sink_h *scmirro
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *width = 0;
        *height = 0;
@@ -562,6 +588,7 @@ int scmirroring_sink_get_negotiated_video_frame_rate(scmirroring_sink_h *scmirro
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *frame_rate = 0;
 
@@ -591,6 +618,7 @@ int scmirroring_sink_get_negotiated_audio_codec(scmirroring_sink_h *scmirroring_
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *codec = SCMIRRORING_AUDIO_CODEC_NONE;
 
@@ -634,6 +662,7 @@ int scmirroring_sink_get_negotiated_audio_channel(scmirroring_sink_h *scmirrorin
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *channel = 0;
 
@@ -662,6 +691,7 @@ int scmirroring_sink_get_negotiated_audio_sample_rate(scmirroring_sink_h *scmirr
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *sample_rate = 0;
 
@@ -690,6 +720,7 @@ int scmirroring_sink_get_negotiated_audio_bitwidth(scmirroring_sink_h *scmirrori
 
        handle = (scmirroring_sink_s *)(*scmirroring_sink);
        scmirroring_retvm_if(handle == NULL, SCMIRRORING_ERROR_INVALID_PARAMETER, "handle is NULL");
+       scmirroring_retvm_if(handle->magic_num != SCMIRRORING_MAGIC_NUMBER, SCMIRRORING_ERROR_INVALID_PARAMETER, "scmirroring_sink is invalid handle");
 
        *bitwidth = 0;