Steve, Not exactly the same as your latest patch ... - use snprintf() - use write to test that we can actually use all of the file.
Signed-off-by: Angus Salkeld <[email protected]> --- exec/coroipcs.c | 74 +++++++++++++++++++++++++++++++++++----------- lib/coroipcc.c | 88 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 120 insertions(+), 42 deletions(-) diff --git a/exec/coroipcs.c b/exec/coroipcs.c index a2deb8a..1a084d5 100644 --- a/exec/coroipcs.c +++ b/exec/coroipcs.c @@ -254,10 +254,13 @@ memory_map ( size_t bytes, void **buf) { - int fd; + int32_t fd; void *addr_orig; void *addr; - int res; + int32_t res; + char buffer[128]; + int32_t i; + int32_t written; fd = open (path, O_RDWR, 0600); @@ -269,24 +272,33 @@ memory_map ( res = ftruncate (fd, bytes); if (res == -1) { - close (fd); - return (-1); + goto error_close_unlink; + } + memset (buffer, 0, sizeof (buffer)); + for (i = 0; i < (bytes / 64); i++) { +retry_write: + written = write (fd, buffer, 64); + if (written == -1 && errno == EINTR) { + goto retry_write; + } + if (written != 64) { + goto error_close_unlink; + } } addr_orig = mmap (NULL, bytes, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (addr_orig == MAP_FAILED) { - close (fd); - return (-1); + goto error_close_unlink; } addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr != addr_orig) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(addr, bytes, MADV_NOSYNC); @@ -298,6 +310,11 @@ memory_map ( } *buf = addr_orig; return (0); + +error_close_unlink: + close (fd); + unlink(path); + return -1; } static int @@ -306,10 +323,13 @@ circular_memory_map ( size_t bytes, void **buf) { - int fd; + int32_t fd; void *addr_orig; void *addr; - int res; + int32_t res; + char buffer[128]; + int32_t i; + int32_t written; fd = open (path, O_RDWR, 0600); @@ -320,24 +340,34 @@ circular_memory_map ( } res = ftruncate (fd, bytes); if (res == -1) { - close (fd); - return (-1); + goto error_close_unlink; + } + memset (buffer, 0, sizeof (buffer)); + for (i = 0; i < (bytes / 64); i++) { +retry_write: + written = write (fd, buffer, 64); + if (written == -1 && errno == EINTR) { + goto retry_write; + } + if (written != 64) { + goto error_close_unlink; + } } addr_orig = mmap (NULL, bytes << 1, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (addr_orig == MAP_FAILED) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + goto error_close_unlink; } addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr != addr_orig) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(addr_orig, bytes, MADV_NOSYNC); @@ -347,8 +377,9 @@ circular_memory_map ( bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr == MAP_FAILED) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + munmap(addr, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC); @@ -356,10 +387,17 @@ circular_memory_map ( res = close (fd); if (res) { + munmap(addr_orig, bytes); + munmap(addr, bytes); return (-1); } *buf = addr_orig; return (0); + +error_close_unlink: + close (fd); + unlink(path); + return (-1); } static inline int diff --git a/lib/coroipcc.c b/lib/coroipcc.c index 0d2d13b..944a85c 100644 --- a/lib/coroipcc.c +++ b/lib/coroipcc.c @@ -40,6 +40,7 @@ #include <stdlib.h> #include <stdio.h> #include <unistd.h> +#include <limits.h> #include <errno.h> #include <string.h> #include <fcntl.h> @@ -283,16 +284,19 @@ union semun { static int circular_memory_map (char *path, const char *file, void **buf, size_t bytes) { - int fd; + int32_t fd; void *addr_orig; void *addr; - int res; + int32_t res; + char buffer[128]; + int32_t i; + int32_t written; - sprintf (path, "/dev/shm/%s", file); + snprintf (path, PATH_MAX, "/dev/shm/%s", file); fd = mkstemp (path); if (fd == -1) { - sprintf (path, LOCALSTATEDIR "/run/%s", file); + snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file); fd = mkstemp (path); if (fd == -1) { return (-1); @@ -301,24 +305,33 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes) res = ftruncate (fd, bytes); if (res == -1) { - close (fd); - return (-1); + goto error_close_unlink; + } + memset (buffer, 0, sizeof (buffer)); + for (i = 0; i < (bytes / 64); i++) { +retry_write: + written = write (fd, buffer, 64); + if (written == -1 && errno == EINTR) { + goto retry_write; + } + if (written != 64) { + goto error_close_unlink; + } } addr_orig = mmap (NULL, bytes << 1, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (addr_orig == MAP_FAILED) { - close (fd); - return (-1); + goto error_close_unlink; } addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr != addr_orig) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(addr_orig, bytes, MADV_NOSYNC); @@ -328,8 +341,9 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes) bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr == MAP_FAILED) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + munmap(addr, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC); @@ -337,10 +351,17 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes) res = close (fd); if (res) { + munmap(addr_orig, bytes); + munmap(addr, bytes); return (-1); } *buf = addr_orig; return (0); + +error_close_unlink: + close (fd); + unlink(path); + return (-1); } static void @@ -362,19 +383,23 @@ void ipc_hdb_destructor (void *context ) { memory_unmap (ipc_instance->response_buffer, ipc_instance->response_size); memory_unmap (ipc_instance->dispatch_buffer, (ipc_instance->dispatch_size) << 1); } + static int memory_map (char *path, const char *file, void **buf, size_t bytes) { - int fd; + int32_t fd; void *addr_orig; void *addr; - int res; + int32_t res; + char buffer[128]; + int32_t i; + int32_t written; - sprintf (path, "/dev/shm/%s", file); + snprintf (path, PATH_MAX, "/dev/shm/%s", file); fd = mkstemp (path); if (fd == -1) { - sprintf (path, LOCALSTATEDIR "/run/%s", file); + snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file); fd = mkstemp (path); if (fd == -1) { return (-1); @@ -383,24 +408,33 @@ memory_map (char *path, const char *file, void **buf, size_t bytes) res = ftruncate (fd, bytes); if (res == -1) { - close (fd); - return (-1); + goto error_close_unlink; + } + memset (buffer, 0, sizeof (buffer)); + for (i = 0; i < (bytes / 64); i++) { +retry_write: + written = write (fd, buffer, 64); + if (written == -1 && errno == EINTR) { + goto retry_write; + } + if (written != 64) { + goto error_close_unlink; + } } addr_orig = mmap (NULL, bytes, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (addr_orig == MAP_FAILED) { - close (fd); - return (-1); + goto error_close_unlink; } addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_SHARED, fd, 0); if (addr != addr_orig) { - close (fd); - return (-1); + munmap(addr_orig, bytes); + goto error_close_unlink; } #ifdef COROSYNC_BSD madvise(addr_orig, bytes, MADV_NOSYNC); @@ -411,7 +445,13 @@ memory_map (char *path, const char *file, void **buf, size_t bytes) return (-1); } *buf = addr_orig; - return (0); + + return 0; + +error_close_unlink: + close (fd); + unlink(path); + return -1; } static cs_error_t @@ -479,7 +519,7 @@ ipc_sem_wait ( #else struct timespec timeout; struct pollfd pfd; - sem_t *sem; + sem_t *sem = NULL; #endif int res; -- 1.7.1 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
