msg.msg_controllen = CMSG_LEN(sizeof_fds);
cmptr = CMSG_FIRSTHDR(&msg);
+ if (!cmptr)
+ return -EINVAL;
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
cmptr->cmsg_len = CMSG_LEN(sizeof_fds);
msg.msg_iovlen = 1;
do {
- ret = sendmsg(sock, &msg, 0);
+ ret = sendmsg(sock, &msg, MSG_NOSIGNAL);
} while (ret < 0 && errno == EINTR);
if (ret < 0) {
/*
case 0: /* orderly shutdown */
return -EPIPE;
case sizeof(*lur):
+ {
+ int err = 0;
+
if (lur->handle != expected_handle) {
ERR("Unexpected result message handle: "
"expected: %u vs received: %u\n",
expected_handle, lur->handle);
- return -EINVAL;
+ err = 1;
}
if (lur->cmd != expected_cmd) {
ERR("Unexpected result message command "
"expected: %u vs received: %u\n",
expected_cmd, lur->cmd);
+ err = 1;
+ }
+ if (err) {
return -EINVAL;
+ } else {
+ return lur->ret_code;
}
- return lur->ret_code;
+ }
default:
if (len >= 0) {
ERR("incorrect message size: %zd\n", len);
msg.m.model_emf_uri_len = model_emf_uri_len;
len = ustcomm_send_unix_sock(sock, &msg, sizeof(msg));
if (len > 0 && len != sizeof(msg)) {
- free(fields);
- return -EIO;
+ ret = -EIO;
+ goto error_fields;
}
if (len < 0) {
- free(fields);
- return len;
+ ret = len;
+ goto error_fields;
}
/* send signature */
len = ustcomm_send_unix_sock(sock, signature, signature_len);
if (len > 0 && len != signature_len) {
- free(fields);
- return -EIO;
+ ret = -EIO;
+ goto error_fields;
}
if (len < 0) {
- free(fields);
- return len;
+ ret = len;
+ goto error_fields;
}
/* send fields */
if (fields_len > 0) {
len = ustcomm_send_unix_sock(sock, fields, fields_len);
- free(fields);
if (len > 0 && len != fields_len) {
- return -EIO;
+ ret = -EIO;
+ goto error_fields;
}
if (len < 0) {
- return len;
+ ret = len;
+ goto error_fields;
}
- } else {
- free(fields);
}
+ free(fields);
if (model_emf_uri_len) {
/* send model_emf_uri */
len = ustcomm_send_unix_sock(sock, model_emf_uri,
model_emf_uri_len);
- if (len > 0 && len != model_emf_uri_len)
+ if (len > 0 && len != model_emf_uri_len) {
return -EIO;
- if (len < 0)
+ }
+ if (len < 0) {
return len;
+ }
}
/* receive reply */
return len;
}
}
+ /* Unreached. */
+
+ /* Error path only. */
+error_fields:
+ free(fields);
+ return ret;
}
/*