Fix raw data transfer module 80/51680/3 accepted/tizen/mobile/20151112.232118 accepted/tizen/tv/20151112.232132 accepted/tizen/wearable/20151112.232146 submit/tizen/20151112.073258
authorMinje Ahn <minje.ahn@samsung.com>
Thu, 12 Nov 2015 05:51:16 +0000 (14:51 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Thu, 12 Nov 2015 07:14:26 +0000 (16:14 +0900)
Change-Id: I7369537d3336b680ac456dcd94c11a25fd1ec475
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
src/server/media-server-thumb.c

index c1c56e5..e7ac4bb 100755 (executable)
@@ -196,7 +196,12 @@ int _media_thumb_get_error()
 int _ms_thumb_recv_msg(int sock, thumbMsg *msg)
 {
        int recv_msg_len = 0;
+       int remain_size = 0;
+       int block_size = MS_SOCK_BLOCK_SIZE;
+       int recv_block = 0;
        unsigned char *buf = NULL;
+       unsigned char *block_buf = NULL;
+
        unsigned int header_size = 0;
 
        header_size = sizeof(thumbMsg) -(MAX_FILEPATH_LEN * 2) - sizeof(unsigned char *);
@@ -223,47 +228,52 @@ int _ms_thumb_recv_msg(int sock, thumbMsg *msg)
                return MS_MEDIA_ERR_NONE;
        }
 
-       if (msg->origin_path_size <= 0 || msg->origin_path_size > MS_FILE_PATH_LEN_MAX) {
-               MS_SAFE_FREE(buf);
-               MS_DBG_ERR("msg->origin_path_size is invalid %d", msg->origin_path_size);
-               return MS_MEDIA_ERR_DATA_TAINTED;
-       }
+       MS_MALLOC(block_buf, MS_SOCK_BLOCK_SIZE);
 
-       MS_MALLOC(buf, (unsigned int)(msg->origin_path_size));
+       remain_size = msg->origin_path_size + msg->dest_path_size + msg->thumb_size;
+       MS_MALLOC(buf, remain_size);
        if (buf == NULL) {
-               MS_DBG_STRERROR("malloc failed");
+               MS_SAFE_FREE(block_buf);
                return MS_MEDIA_ERR_OUT_OF_MEMORY;
        }
 
-       if ((recv_msg_len = recv(sock, buf, msg->origin_path_size, 0)) < 0) {
-               MS_DBG_STRERROR("recv failed");
-               MS_SAFE_FREE(buf);
-               return _media_thumb_get_error();
+       while (remain_size > 0) {
+               if (remain_size < MS_SOCK_BLOCK_SIZE) {
+                       block_size = remain_size;
+               }
+               if ((recv_msg_len = recv(sock, block_buf, block_size, 0)) < 0) {
+                       MS_DBG_STRERROR("recv failed");
+                       MS_SAFE_FREE(buf);
+                       MS_SAFE_FREE(block_buf);
+                       return _media_thumb_get_error();
+               }
+               memcpy(buf+recv_block, block_buf, block_size);
+               recv_block += block_size;
+               remain_size -= block_size;
+               memset(block_buf, 0, MS_SOCK_BLOCK_SIZE);
        }
-       strncpy(msg->org_path, (char*)buf, msg->origin_path_size);
 
-       MS_SAFE_FREE(buf);
+       MS_SAFE_FREE(block_buf);
 
-       if (msg->dest_path_size <= 0 || msg->dest_path_size > MS_FILE_PATH_LEN_MAX) {
+       if (msg->origin_path_size <= 0 || msg->origin_path_size > MS_FILE_PATH_LEN_MAX) {
                MS_SAFE_FREE(buf);
-               MS_DBG_ERR("msg->dest_path_size is invalid %d", msg->dest_path_size);
+               MS_DBG_ERR("msg->origin_path_size is invalid %d", msg->origin_path_size);
+
                return MS_MEDIA_ERR_DATA_TAINTED;
        }
 
-       MS_MALLOC(buf, (unsigned int)(msg->dest_path_size));
-       if (buf == NULL) {
-               MS_DBG_ERR("malloc failed");
-               return MS_MEDIA_ERR_OUT_OF_MEMORY;
-       }
+       strncpy(msg->org_path, (char*)buf, msg->origin_path_size);
 
-       if ((recv_msg_len = recv(sock, buf, msg->dest_path_size, 0)) < 0) {
-               MS_DBG_ERR("recv failed : %s");
+       if (msg->dest_path_size <= 0 || msg->dest_path_size > MS_FILE_PATH_LEN_MAX) {
                MS_SAFE_FREE(buf);
-               return _media_thumb_get_error();
+               MS_DBG_ERR("msg->dest_path_size is invalid %d", msg->dest_path_size);
+
+               return MS_MEDIA_ERR_DATA_TAINTED;
        }
-       strncpy(msg->dst_path, (char*)buf, msg->dest_path_size);
 
-       MS_SAFE_FREE(buf);
+       strncpy(msg->dst_path, (char *)buf + msg->origin_path_size, msg->dest_path_size);
+
+       MS_SAFE_FREE(msg->thumb_data);
 
        if (msg->thumb_size < 0) {
                MS_SAFE_FREE(buf);
@@ -272,30 +282,18 @@ int _ms_thumb_recv_msg(int sock, thumbMsg *msg)
        }
 
        if (msg->thumb_size > 0) {
-               MS_MALLOC(buf, (unsigned int)(msg->thumb_size));
-               if (buf == NULL) {
-                       MS_DBG_ERR("malloc failed");
-                       return MS_MEDIA_ERR_OUT_OF_MEMORY;
-               }
-
-               if ((recv_msg_len = recv(sock, buf, msg->thumb_size, 0)) < 0) {
-                       MS_DBG_ERR("recv failed : %s", strerror(errno));
-                       MS_SAFE_FREE(buf);
-                       return _media_thumb_get_error();
-               }
-
-               MS_SAFE_FREE(msg->thumb_data);
                MS_MALLOC(msg->thumb_data, (unsigned int)(msg->thumb_size));
-               if (msg->thumb_data == NULL) {
-                       MS_DBG_ERR("malloc failed");
+               if (msg->thumb_data != NULL) {
+                       memcpy(msg->thumb_data, buf + msg->origin_path_size + msg->dest_path_size, msg->thumb_size);
+               } else {
                        MS_SAFE_FREE(buf);
+
                        return MS_MEDIA_ERR_OUT_OF_MEMORY;
                }
-               memcpy(msg->thumb_data, buf, msg->thumb_size);
-
-               MS_SAFE_FREE(buf);
        }
 
+       MS_SAFE_FREE(buf);
+
        return MS_MEDIA_ERR_NONE;
 }