Name: capi-media-controller
Summary: A media controller library in Tizen Native API
-Version: 0.1.60
+Version: 0.1.61
Release: 1
Group: Multimedia/API
License: Apache-2.0
}
request_msg_size = strlen(request_msg);
- if (request_msg_size >= MAX_MSG_SIZE) {
- mc_error("Query is Too long. [%d] query size limit is [%d]", request_msg_size, MAX_MSG_SIZE);
- return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
- }
mc_secure_debug("msg_type[%d] priv_type[%d], message[%s]", msg_type, priv_type, request_msg);
send_msg.pid = getpid();
send_msg.uid = getuid();
send_msg.msg_size = request_msg_size;
- MC_SAFE_STRLCPY(send_msg.msg, request_msg, sizeof(send_msg.msg));
/*Create Socket*/
ret = mc_ipc_create_client_socket(MC_TIMEOUT_SEC_5, &sockfd);
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
- /* Send request */
- if (send(sockfd, &send_msg, sizeof(send_msg), 0) != sizeof(send_msg)) {
- mc_stderror("send failed");
- close(sockfd);
+ size_t full_msg_size = 0;
+ size_t head_msg_size = 0;
+ size_t send_msg_size = 0;
+ size_t temp_buf_index = 0;
+ char *temp_buf = NULL;
- return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+ head_msg_size = sizeof(send_msg) - sizeof(send_msg.msg);
+ full_msg_size = head_msg_size + request_msg_size;
+
+ temp_buf = (char *)calloc(1, full_msg_size + 1);
+ if (temp_buf == NULL) {
+ mc_error("Error memroy allocation");
+ return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
}
+ memcpy(temp_buf, &send_msg, head_msg_size);
+ memcpy(temp_buf + head_msg_size, request_msg, request_msg_size);
+
+ if (full_msg_size <= MAX_MSG_SIZE)
+ send_msg_size = full_msg_size;
+ else
+ send_msg_size = head_msg_size;
+
+ while (temp_buf_index < full_msg_size) {
+ size_t send_result = 0;
+ /* Send request */
+ send_result = send(sockfd, temp_buf + temp_buf_index, send_msg_size, 0);
+ if (send_result < send_msg_size) {
+ mc_stderror("send failed");
+ close(sockfd);
+ MC_SAFE_FREE(temp_buf);
+ return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+ }
+ temp_buf_index += send_result;
+ if ((full_msg_size - temp_buf_index) > MAX_MSG_SIZE)
+ send_msg_size = MAX_MSG_SIZE;
+ else
+ send_msg_size = full_msg_size - temp_buf_index;
+ }
+
+ MC_SAFE_FREE(temp_buf);
/*Receive Response*/
int recv_msg_size = -1;
#endif /* __cplusplus */
#define SERVER_IP "127.0.0.1"
-#define MC_TIMEOUT_SEC_5 5 /**< Response from Server time out */
-#define MAX_MSG_SIZE 4096*2
+#define MC_TIMEOUT_SEC_5 5 /* Response from daemon time out */
+#define MAX_MSG_SIZE 10 * 1024 /* Maximum of message to daemon */
#define MC_SOCK_NOT_ALLOCATE -1
#define MC_SOCK_ACTIVATION_PATH "/run/.mediacontroller.sock" /* tzplatform_mkpath(TZ_SYS_RUN, ".media_controller.sock") */
#define MC_IPC_PATH "/run/.mediacontroller-comm.sock" /* tzplatform_mkpath(TZ_SYS_RUN, ".media_controller-comm.sock") */
uid_t uid;
int result;
size_t msg_size; /*this is size of message below and this does not include the terminationg null byte ('\0'). */
- char msg[MAX_MSG_SIZE];
+ char *msg;
} mc_comm_msg_s;
int mc_ipc_create_client_socket(int timeout_sec, int *sock_fd);
int mc_cynara_receive_untrusted_message(int sockfd, mc_comm_msg_s *recv_msg, mc_peer_creds *credentials)
{
int ret = 0;
- int recv_msg_size = 0;
+ size_t recv_msg_size = 0;
+ size_t head_size = 0;
if (!recv_msg || !credentials)
return MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER;
- if ((recv_msg_size = read(sockfd, recv_msg, sizeof(mc_comm_msg_s))) < 0) {
+ head_size = sizeof(mc_comm_msg_s) - sizeof(recv_msg->msg);
+ if ((recv_msg_size = read(sockfd, recv_msg, head_size)) < head_size) {
if (errno == EWOULDBLOCK) {
mc_error("Timeout. Can't try any more");
return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
}
}
+ if (recv_msg->msg_size > 0) {
+ size_t remain_size = recv_msg->msg_size;
+ size_t block_size = 0;
+ size_t msg_index = 0;
+ char *recv_buf = NULL;
+
+ recv_buf = (char *)calloc(1, MAX_MSG_SIZE + 1);
+ recv_msg->msg = (char *)calloc(1, recv_msg->msg_size + 1);
+
+ if (recv_buf == NULL || recv_msg->msg == NULL) {
+ mc_error("Error memroy allocation");
+ MC_SAFE_FREE(recv_buf);
+ MC_SAFE_FREE(recv_msg->msg);
+ return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+ }
+
+ while (remain_size > 0) {
+ memset(recv_buf, 0, MAX_MSG_SIZE + 1);
+ if (remain_size < MAX_MSG_SIZE)
+ block_size = remain_size;
+ else
+ block_size = MAX_MSG_SIZE;
+
+ if ((recv_msg_size = read(sockfd, recv_buf, block_size)) < block_size) {
+ MC_SAFE_FREE(recv_buf);
+ MC_SAFE_FREE(recv_msg->msg);
+ if (errno == EWOULDBLOCK) {
+ mc_error("Timeout. Can't try any more");
+ return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+ } else {
+ mc_stderror("recv failed");
+ return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
+ }
+ }
+
+ memcpy(recv_msg->msg + msg_index, recv_buf, recv_msg_size);
+ msg_index += recv_msg_size;
+ remain_size -= recv_msg_size;
+ }
+
+ MC_SAFE_FREE(recv_buf);
+ } else {
+ mc_error("msg_size is zero");
+ recv_msg->msg = NULL;
+ }
+
/* mc_debug("receive msg[%d] from [%d(%d)] %d, %s", recv_msg_size, recv_msg->pid, recv_msg->uid, recv_msg->msg_type, recv_msg->msg); */
ret = cynara_creds_socket_get_pid(sockfd, &(credentials->pid));
{
mc_service_request *req = (mc_service_request *)data;
if (req != NULL) {
+ if (req->req_msg != NULL)
+ MC_SAFE_FREE(req->req_msg->msg);
MC_SAFE_FREE(req->req_msg);
MC_SAFE_FREE(req);
}
goto ERROR;
}
- req->req_msg = (mc_comm_msg_s *) malloc(sizeof(mc_comm_msg_s));
+ req->req_msg = (mc_comm_msg_s *) calloc(1, sizeof(mc_comm_msg_s));
if (req->req_msg == NULL) {
send_msg = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
- MC_SAFE_FREE(req->req_msg);
goto ERROR;
}
- memset(req->req_msg, 0x00, sizeof(mc_comm_msg_s));
- memcpy(req->req_msg, &recv_msg, sizeof(mc_comm_msg_s));
+ memcpy(req->req_msg, &recv_msg, sizeof(mc_comm_msg_s) - sizeof(recv_msg.msg));
+
+ if (recv_msg.msg_size > 0) {
+ req->req_msg->msg = (char *) calloc(1, recv_msg.msg_size + 1);
+ if (req->req_msg->msg == NULL) {
+ send_msg = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+ MC_SAFE_FREE(req->req_msg);
+ goto ERROR;
+ }
+
+ memcpy(req->req_msg->msg, recv_msg.msg, recv_msg.msg_size);
+ } else {
+ req->req_msg->msg = NULL;
+ }
mc_debug("msg(%d) is queued", req->req_msg->msg_type);
g_queue_push_tail(request_queue, (gpointer)req);
mc_stderror("close failed");
if (req != NULL) {
+ if (req->req_msg != NULL)
+ MC_SAFE_FREE(req->req_msg->msg);
MC_SAFE_FREE(req->req_msg);
MC_SAFE_FREE(req);
}
/* Create TCP Socket*/
ret = mc_ipc_create_server_socket(MC_DB_UPDATE_PORT, &sockfd);
if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
- /* Disconnect DB*/
mc_error("Failed to create socket");
_mc_service_deinit(mc_service_data);
return FALSE;