[prev in list] [next in list] [prev in thread] [next in thread]
List: openais
Subject: [Openais] corosync trunk - patch to coroipcc_service_connect to
From: Steven Dake <sdake () redhat ! com>
Date: 2010-02-24 22:02:50
Message-ID: 1267048970.2567.14.camel () localhost ! localdomain
[Download RAW message or body]
Currently if some operations such as mmap or open fail during the
coroipcc_service_connect operation (used internally by all C apis in the
lib directory), the app is likely to segfault rather then return an
error.
This patch allows the user to capture an error code instead.
Regards
-steve
["corosync-trunk-coroipcc-service-connect-error-checking.patch" (corosync-trunk-coroipcc-service-connect-error-checking.patch)]
Index: lib/coroipcc.c
===================================================================
--- lib/coroipcc.c (revision 2662)
+++ lib/coroipcc.c (working copy)
@@ -650,8 +650,8 @@
sys_res = connect (request_fd, (struct sockaddr *)&address,
COROSYNC_SUN_LEN(&address));
if (sys_res == -1) {
- close (request_fd);
- return (CS_ERR_TRY_AGAIN);
+ res = CS_ERR_TRY_AGAIN;
+ goto error_connect;
}
res = memory_map (
@@ -659,24 +659,40 @@
"control_buffer-XXXXXX",
(void *)&ipc_instance->control_buffer,
8192);
+ if (res == -1) {
+ res = CS_ERR_LIBRARY;
+ goto error_connect;
+ }
res = memory_map (
request_map_path,
"request_buffer-XXXXXX",
(void *)&ipc_instance->request_buffer,
request_size);
+ if (res == -1) {
+ res = CS_ERR_LIBRARY;
+ goto error_request_buffer;
+ }
res = memory_map (
response_map_path,
"response_buffer-XXXXXX",
(void *)&ipc_instance->response_buffer,
response_size);
+ if (res == -1) {
+ res = CS_ERR_LIBRARY;
+ goto error_response_buffer;
+ }
res = circular_memory_map (
dispatch_map_path,
"dispatch_buffer-XXXXXX",
(void *)&ipc_instance->dispatch_buffer,
dispatch_size);
+ if (res == -1) {
+ res = CS_ERR_LIBRARY;
+ goto error_dispatch_buffer;
+ }
#if _POSIX_THREAD_PROCESS_SHARED > 0
sem_init (&ipc_instance->control_buffer->sem0, 1, 0);
@@ -702,19 +718,19 @@
* an existing shared memory segment for which we have access
*/
if (errno != EEXIST && errno != EACCES) {
- goto res_exit;
+ goto error_exit;
}
}
semun.val = 0;
res = semctl (ipc_instance->semid, 0, SETVAL, semun);
if (res != 0) {
- goto res_exit;
+ goto error_exit;
}
res = semctl (ipc_instance->semid, 1, SETVAL, semun);
if (res != 0) {
- goto res_exit;
+ goto error_exit;
}
#endif
@@ -737,18 +753,19 @@
res = socket_send (request_fd, &req_setup, sizeof (mar_req_setup_t));
if (res != CS_OK) {
- goto res_exit;
+ goto error_exit;
}
res = socket_recv (request_fd, &res_setup, sizeof (mar_res_setup_t));
if (res != CS_OK) {
- goto res_exit;
+ goto error_exit;
}
ipc_instance->fd = request_fd;
ipc_instance->flow_control_state = 0;
if (res_setup.error == CS_ERR_TRY_AGAIN) {
- goto res_exit;
+ res = res_setup.error;
+ goto error_exit;
}
ipc_instance->control_size = 8192;
@@ -762,13 +779,25 @@
return (res_setup.error);
-res_exit:
- close (request_fd);
+error_exit:
#if _POSIX_THREAD_PROCESS_SHARED < 1
if (ipc_instance->semid > 0)
semctl (ipc_instance->semid, 0, IPC_RMID);
#endif
- return (res_setup.error);
+ memory_unmap (ipc_instance->dispatch_buffer, dispatch_size);
+error_dispatch_buffer:
+ memory_unmap (ipc_instance->response_buffer, response_size);
+error_response_buffer:
+ memory_unmap (ipc_instance->request_buffer, request_size);
+error_request_buffer:
+ memory_unmap (ipc_instance->control_buffer, 8192);
+error_connect:
+ close (request_fd);
+
+ hdb_handle_destroy (&ipc_hdb, *handle);
+ hdb_handle_put (&ipc_hdb, *handle);
+
+ return (res);
}
cs_error_t
_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic