Re: [devel] [PATCH 1/1] rde: avoid SIGPIPE in send functions [#2800]

2018-03-12 Thread Gary Lee
Thanks for the pickup. My bad. I got preoccupied looking at the partial 
write and possible issues with recv(). The code seems to assume the 
entire message is received with each recv(). I guess it's mostly true, 
because the messages are so small.



On 13/03/18 01:30, Anders Widell wrote:
Ack with minor comment: Return type from strlen() is size_t, and 
return type from send() is ssize_t. So a more type-correct way to 
implement this is outlined in my inlined comments in the code below.


regards,

Anders Widell


On 03/09/2018 02:44 AM, Gary Lee wrote:

---
  src/rde/agent/rda_papi.cc | 8 +---
  src/rde/rded/rde_rda.cc   | 8 +---
  2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/rde/agent/rda_papi.cc b/src/rde/agent/rda_papi.cc
index a07d2b06f..57ad57761 100644
--- a/src/rde/agent/rda_papi.cc
+++ b/src/rde/agent/rda_papi.cc
@@ -654,14 +654,16 @@ static PCSRDA_RETURN_CODE rda_callback_req(int 
sockfd, PCS_RDA_ROLE *role) {

*/
  static PCSRDA_RETURN_CODE rda_write_msg(int sockfd, char *msg) {
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;


AndersW> const size_t msg_size = strlen(msg) + 1;


+  int bytes_sent = 0;


AndersW> Remove the line above.

      /*
 ** Read from socket into input buffer
 */
  -  msg_size = send(sockfd, msg, strlen(msg) + 1, 0);
-  if (msg_size < 0) {
+  bytes_sent = send(sockfd, msg, msg_size, MSG_NOSIGNAL);


AndersW> Replace with: ssize_t bytes_sent = send(...


+  if (bytes_sent < 0 || bytes_sent != msg_size) {


AndersW> Replace with: if (bytes_sent < 0 || 
static_cast(bytes_sent) != msg_size) {



+    // @todo handle partial write?
  return PCSRDA_RC_IPC_SEND_FAILED;
    }
  diff --git a/src/rde/rded/rde_rda.cc b/src/rde/rded/rde_rda.cc
index 04e1c4bfc..ab9f25d77 100644
--- a/src/rde/rded/rde_rda.cc
+++ b/src/rde/rded/rde_rda.cc
@@ -179,11 +179,13 @@ static uint32_t rde_rda_sock_close(RDE_RDA_CB 
*rde_rda_cb) {

*/
  static uint32_t rde_rda_write_msg(int fd, char *msg) {
    int rc = NCSCC_RC_SUCCESS;
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;
+  int bytes_sent = 0;


AndersW> Same comments as above.


      TRACE_ENTER2("%u - '%s'", fd, msg);
-  msg_size = send(fd, msg, strlen(msg) + 1, 0);
-  if (msg_size < 0) {
+  bytes_sent = send(fd, msg, msg_size, MSG_NOSIGNAL);
+  if (bytes_sent < 0 || bytes_sent != msg_size) {
+    // @todo handle partial write?
  if (errno != EINTR && errno != EWOULDBLOCK)
    LOG_ER("send FAILED %s", strerror(errno));





--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel


Re: [devel] [PATCH 1/1] rde: avoid SIGPIPE in send functions [#2800]

2018-03-12 Thread Anders Widell
Ack with minor comment: Return type from strlen() is size_t, and return 
type from send() is ssize_t. So a more type-correct way to implement 
this is outlined in my inlined comments in the code below.


regards,

Anders Widell


On 03/09/2018 02:44 AM, Gary Lee wrote:

---
  src/rde/agent/rda_papi.cc | 8 +---
  src/rde/rded/rde_rda.cc   | 8 +---
  2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/rde/agent/rda_papi.cc b/src/rde/agent/rda_papi.cc
index a07d2b06f..57ad57761 100644
--- a/src/rde/agent/rda_papi.cc
+++ b/src/rde/agent/rda_papi.cc
@@ -654,14 +654,16 @@ static PCSRDA_RETURN_CODE rda_callback_req(int sockfd, 
PCS_RDA_ROLE *role) {
  
   */

  static PCSRDA_RETURN_CODE rda_write_msg(int sockfd, char *msg) {
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;


AndersW> const size_t msg_size = strlen(msg) + 1;


+  int bytes_sent = 0;


AndersW> Remove the line above.
  
/*

 ** Read from socket into input buffer
 */
  
-  msg_size = send(sockfd, msg, strlen(msg) + 1, 0);

-  if (msg_size < 0) {
+  bytes_sent = send(sockfd, msg, msg_size, MSG_NOSIGNAL);


AndersW> Replace with: ssize_t bytes_sent = send(...


+  if (bytes_sent < 0 || bytes_sent != msg_size) {


AndersW> Replace with: if (bytes_sent < 0 || 
static_cast(bytes_sent) != msg_size) {



+// @todo handle partial write?
  return PCSRDA_RC_IPC_SEND_FAILED;
}
  
diff --git a/src/rde/rded/rde_rda.cc b/src/rde/rded/rde_rda.cc

index 04e1c4bfc..ab9f25d77 100644
--- a/src/rde/rded/rde_rda.cc
+++ b/src/rde/rded/rde_rda.cc
@@ -179,11 +179,13 @@ static uint32_t rde_rda_sock_close(RDE_RDA_CB 
*rde_rda_cb) {
   
*/
  static uint32_t rde_rda_write_msg(int fd, char *msg) {
int rc = NCSCC_RC_SUCCESS;
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;
+  int bytes_sent = 0;


AndersW> Same comments as above.

  
TRACE_ENTER2("%u - '%s'", fd, msg);

-  msg_size = send(fd, msg, strlen(msg) + 1, 0);
-  if (msg_size < 0) {
+  bytes_sent = send(fd, msg, msg_size, MSG_NOSIGNAL);
+  if (bytes_sent < 0 || bytes_sent != msg_size) {
+// @todo handle partial write?
  if (errno != EINTR && errno != EWOULDBLOCK)
LOG_ER("send FAILED %s", strerror(errno));
  



--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel


[devel] [PATCH 1/1] rde: avoid SIGPIPE in send functions [#2800]

2018-03-08 Thread Gary Lee
---
 src/rde/agent/rda_papi.cc | 8 +---
 src/rde/rded/rde_rda.cc   | 8 +---
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/rde/agent/rda_papi.cc b/src/rde/agent/rda_papi.cc
index a07d2b06f..57ad57761 100644
--- a/src/rde/agent/rda_papi.cc
+++ b/src/rde/agent/rda_papi.cc
@@ -654,14 +654,16 @@ static PCSRDA_RETURN_CODE rda_callback_req(int sockfd, 
PCS_RDA_ROLE *role) {
 
  */
 static PCSRDA_RETURN_CODE rda_write_msg(int sockfd, char *msg) {
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;
+  int bytes_sent = 0;
 
   /*
** Read from socket into input buffer
*/
 
-  msg_size = send(sockfd, msg, strlen(msg) + 1, 0);
-  if (msg_size < 0) {
+  bytes_sent = send(sockfd, msg, msg_size, MSG_NOSIGNAL);
+  if (bytes_sent < 0 || bytes_sent != msg_size) {
+// @todo handle partial write?
 return PCSRDA_RC_IPC_SEND_FAILED;
   }
 
diff --git a/src/rde/rded/rde_rda.cc b/src/rde/rded/rde_rda.cc
index 04e1c4bfc..ab9f25d77 100644
--- a/src/rde/rded/rde_rda.cc
+++ b/src/rde/rded/rde_rda.cc
@@ -179,11 +179,13 @@ static uint32_t rde_rda_sock_close(RDE_RDA_CB 
*rde_rda_cb) {
  */
 static uint32_t rde_rda_write_msg(int fd, char *msg) {
   int rc = NCSCC_RC_SUCCESS;
-  int msg_size = 0;
+  const int msg_size = strlen(msg) + 1;
+  int bytes_sent = 0;
 
   TRACE_ENTER2("%u - '%s'", fd, msg);
-  msg_size = send(fd, msg, strlen(msg) + 1, 0);
-  if (msg_size < 0) {
+  bytes_sent = send(fd, msg, msg_size, MSG_NOSIGNAL);
+  if (bytes_sent < 0 || bytes_sent != msg_size) {
+// @todo handle partial write?
 if (errno != EINTR && errno != EWOULDBLOCK)
   LOG_ER("send FAILED %s", strerror(errno));
 
-- 
2.14.1


--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel