summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Sawicki <p.sawicki2@partner.samsung.com>2017-09-05 12:40:05 +0200
committerPiotr Sawicki <p.sawicki2@partner.samsung.com>2017-09-08 09:07:36 +0200
commiteb406d44fad1ae64240e5b7a945aeda2d06fe95d (patch)
tree0f4d6990fba08e8ea37ba37f3276561676dbf668
parent95843aa9b16eead28d181ffe34b067fda75545d9 (diff)
downloadcert-svc-eb406d44fad1ae64240e5b7a945aeda2d06fe95d.tar.gz
cert-svc-eb406d44fad1ae64240e5b7a945aeda2d06fe95d.tar.bz2
cert-svc-eb406d44fad1ae64240e5b7a945aeda2d06fe95d.zip
Fix sending responses in cert-server
This commit prevents from sending a partial response to the client. Morover, two memory leaks have been fixed in procedures responsible for retrieving a list of certificates. Change-Id: I9cc27db73ebce9cbeb7c0c04b8f5f56f06201604
-rw-r--r--src/server/src/cert-server-main.c72
1 files changed, 46 insertions, 26 deletions
diff --git a/src/server/src/cert-server-main.c b/src/server/src/cert-server-main.c
index 072aa49..2f07cda 100644
--- a/src/server/src/cert-server-main.c
+++ b/src/server/src/cert-server-main.c
@@ -64,6 +64,25 @@ int CertSvcGetSocketFromSystemd(int *pSockfd)
return CERTSVC_FAIL;
}
+static int sendBuffer(int socket, const char *buffer, size_t length)
+{
+ char *data = (char *)buffer;
+ size_t remaining_length = length;
+
+ do {
+ ssize_t res = send(socket, data, remaining_length, MSG_NOSIGNAL);
+ if (res == -1) {
+ SLOGE("Error during sending data via %d socket errno[%d]", socket, errno);
+ return -1;
+ }
+
+ data += res;
+ remaining_length -= res;
+ } while (remaining_length > 0);
+
+ return length;
+}
+
void CertSvcServerComm(void)
{
int server_sockfd = 0;
@@ -190,8 +209,8 @@ void CertSvcServerComm(void)
recv_data.gname,
send_data.dataBlock);
send_data.dataBlockLen = strlen(send_data.dataBlock);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -200,8 +219,8 @@ void CertSvcServerComm(void)
recv_data.gname,
send_data.dataBlock);
send_data.dataBlockLen = strlen(send_data.dataBlock);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -213,8 +232,7 @@ void CertSvcServerComm(void)
if (send_data.result == CERTSVC_SUCCESS)
send_data.result = update_ca_certificate_file(NULL);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -223,8 +241,7 @@ void CertSvcServerComm(void)
recv_data.storeType,
recv_data.gname,
&send_data.certStatus);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -238,8 +255,7 @@ void CertSvcServerComm(void)
if (send_data.result == CERTSVC_SUCCESS)
send_data.result = update_ca_certificate_file(NULL);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -248,8 +264,7 @@ void CertSvcServerComm(void)
recv_data.storeType,
recv_data.gname,
&send_data.isAliasUnique);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -267,8 +282,7 @@ void CertSvcServerComm(void)
if (recv_data.certType == PEM_CRT || recv_data.certType == P12_TRUSTED)
send_data.result = update_ca_certificate_file(recv_data.dataBlock);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -282,12 +296,14 @@ void CertSvcServerComm(void)
&certListBuffer,
&bufferLen,
&send_data.certCount);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
+
+ if ((result > 0) && (bufferLen > 0)) {
+ result = sendBuffer(client_sockfd, certListBuffer, bufferLen);
+ }
- if (bufferLen > 0)
- result = send(client_sockfd, certListBuffer,
- bufferLen, MSG_NOSIGNAL);
+ free(certListBuffer);
+ certListBuffer = NULL;
break;
}
@@ -298,8 +314,8 @@ void CertSvcServerComm(void)
recv_data.gname,
send_data.common_name,
sizeof(send_data.common_name));
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
+
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
break;
}
@@ -310,12 +326,16 @@ void CertSvcServerComm(void)
&certBlockBuffer,
&blockBufferLen,
&send_data.certBlockCount);
- result = send(client_sockfd, (char *)&send_data,
- sizeof(send_data), MSG_NOSIGNAL);
- if (blockBufferLen > 0)
- result = send(client_sockfd, certBlockBuffer,
- blockBufferLen, MSG_NOSIGNAL);
+ result = sendBuffer(client_sockfd, (char *)&send_data, sizeof(send_data));
+
+ if ((result > 0) && (blockBufferLen > 0)) {
+ result = sendBuffer(client_sockfd, certBlockBuffer, blockBufferLen);
+ }
+
+ free(certBlockBuffer);
+ certBlockBuffer = NULL;
+
break;
}