Here's another buflen-adding patch, to give you an idea of what's in the pipe. For the moment, I'm mainly in the mode of identifying and marking API changes, but not pulling each thread to propagate them throughout the code base. However, for this one, since it's not too big, I have done that, to get an idea of how invasive such a change will end up being.
There haven't been very many of these parameter-adding changes so far (maybe a handful), but I have identified on the order of 100 int->size_t or const-related interface changes. I'm at the 25-30% mark, in auditing the .h files under corosync/include. I haven't tested at all, but the result does compile just as well as the original. >From 61595f5b4711ca97a9461992fbc33d8704c0e60c Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Fri, 3 Apr 2009 15:45:23 +0200 Subject: [PATCH] coroipcc. h (coroipcc_dispatch_recv): Add a buflen parameter. * lib/coroipcc.c (coroipcc_dispatch_recv): Update definition, and... (memcpy_swrap): ... add a parameter here, too. * include/corosync/coroipcc.h (coroipcc_dispatch_recv): * lib/cfg.c (corosync_cfg_dispatch): * lib/confdb.c (confdb_dispatch): * lib/cpg.c (cpg_dispatch, cpg_flow_control_state_get): * lib/evs.c (evs_dispatch): * lib/quorum.c (quorum_dispatch): * lib/votequorum.c (votequorum_dispatch): --- include/corosync/coroipcc.h | 3 ++- lib/cfg.c | 4 +++- lib/confdb.c | 4 +++- lib/coroipcc.c | 17 +++++++++++------ lib/cpg.c | 6 ++++-- lib/evs.c | 7 +++++-- lib/quorum.c | 6 ++++-- lib/votequorum.c | 8 ++++---- 8 files changed, 36 insertions(+), 19 deletions(-) diff --git a/include/corosync/coroipcc.h b/include/corosync/coroipcc.h index 1bf602a..81802ba 100644 --- a/include/corosync/coroipcc.h +++ b/include/corosync/coroipcc.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2002-2003 MontaVista Software, Inc. - * Copyright (c) 2006-2007 Red Hat, Inc. + * Copyright (c) 2006-2007, 2009 Red Hat, Inc. * * All rights reserved. * @@ -85,6 +85,7 @@ int coroipcc_dispatch_recv ( void *ipc_context, void *buf, + size_t buflen, int timeout); int diff --git a/lib/cfg.c b/lib/cfg.c index 326c5dc..0d3ab34 100644 --- a/lib/cfg.c +++ b/lib/cfg.c @@ -195,7 +195,9 @@ corosync_cfg_dispatch ( do { dispatch_avail = coroipcc_dispatch_recv (cfg_instance->ipc_ctx, - (void *)&dispatch_data, timeout); + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); /* * Handle has been finalized in another thread diff --git a/lib/confdb.c b/lib/confdb.c index 8311221..8f76a67 100644 --- a/lib/confdb.c +++ b/lib/confdb.c @@ -330,7 +330,9 @@ cs_error_t confdb_dispatch ( pthread_mutex_lock (&confdb_inst->dispatch_mutex); dispatch_avail = coroipcc_dispatch_recv (confdb_inst->ipc_ctx, - (void *)&dispatch_data, timeout); + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); /* diff --git a/lib/coroipcc.c b/lib/coroipcc.c index ad60c73..c7ac176 100644 --- a/lib/coroipcc.c +++ b/lib/coroipcc.c @@ -440,8 +440,8 @@ coroipcc_fd_get (void *ipc_ctx) return (ipc_segment->fd); } -static void memcpy_swrap ( - void *dest, void *src, int len, unsigned int *read) +static void memcpy_swrap (void *dest, size_t dest_len, + void *src, int len, unsigned int *read) { char *dest_chr = (char *)dest; char *src_chr = (char *)src; @@ -466,7 +466,7 @@ static void memcpy_swrap ( int original_flow = -1; int -coroipcc_dispatch_recv (void *ipc_ctx, void *data, int timeout) +coroipcc_dispatch_recv (void *ipc_ctx, void *data, size_t buflen, int timeout) { struct pollfd ufds; struct sembuf sop; @@ -546,23 +546,28 @@ retry_semop: if (res == -1) { return (-1); } - + + if (buflen < DISPATCH_SIZE) { + return -1; + } + if (ipc_segment->shared_memory->read + sizeof (mar_res_header_t) >= DISPATCH_SIZE) { my_read = ipc_segment->shared_memory->read; - memcpy_swrap (data, + memcpy_swrap (data, DISPATCH_SIZE, ipc_segment->shared_memory->dispatch_buffer, sizeof (mar_res_header_t), &ipc_segment->shared_memory->read); header = (mar_res_header_t *)data; memcpy_swrap ( (void *)((char *)data + sizeof (mar_res_header_t)), + DISPATCH_SIZE, ipc_segment->shared_memory->dispatch_buffer, header->size - sizeof (mar_res_header_t), &ipc_segment->shared_memory->read); } else { header = (mar_res_header_t *)&ipc_segment->shared_memory->dispatch_buffer[ipc_segment->shared_memory->read]; memcpy_swrap ( - data, + data, DISPATCH_SIZE, ipc_segment->shared_memory->dispatch_buffer, header->size, &ipc_segment->shared_memory->read); diff --git a/lib/cpg.c b/lib/cpg.c index 1d05e64..5215f2d 100644 --- a/lib/cpg.c +++ b/lib/cpg.c @@ -266,7 +266,9 @@ cs_error_t cpg_dispatch ( pthread_mutex_lock (&cpg_inst->dispatch_mutex); dispatch_avail = coroipcc_dispatch_recv (cpg_inst->ipc_ctx, - (void *)&dispatch_data, timeout); + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); pthread_mutex_unlock (&cpg_inst->dispatch_mutex); @@ -647,7 +649,7 @@ cs_error_t cpg_flow_control_state_get ( if (error != CS_OK) { return (error); } - + *flow_control_state = coroipcc_dispatch_flow_control_get (cpg_inst->ipc_ctx); saHandleInstancePut (&cpg_handle_t_db, handle); diff --git a/lib/evs.c b/lib/evs.c index 13936fb..0b04c10 100644 --- a/lib/evs.c +++ b/lib/evs.c @@ -2,7 +2,7 @@ * vi: set autoindent tabstop=4 shiftwidth=4 : * Copyright (c) 2004-2005 MontaVista Software, Inc. - * Copyright (c) 2006-2007 Red Hat, Inc. + * Copyright (c) 2006-2007, 2009 Red Hat, Inc. * * All rights reserved. * @@ -222,7 +222,10 @@ evs_error_t evs_dispatch ( } do { - dispatch_avail = coroipcc_dispatch_recv (evs_inst->ipc_ctx, (void *)&dispatch_data, timeout); + dispatch_avail = coroipcc_dispatch_recv (evs_inst->ipc_ctx, + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); if (dispatch_avail == -1) { error = CS_ERR_LIBRARY; goto error_nounlock; diff --git a/lib/quorum.c b/lib/quorum.c index df05876..a18ec83 100644 --- a/lib/quorum.c +++ b/lib/quorum.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Red Hat, Inc. + * Copyright (c) 2008, 2009 Red Hat, Inc. * * All rights reserved. * @@ -392,7 +392,9 @@ cs_error_t quorum_dispatch ( pthread_mutex_lock (&quorum_inst->dispatch_mutex); dispatch_avail = coroipcc_dispatch_recv (quorum_inst->ipc_ctx, - (void *)&dispatch_data, timeout); + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); /* * Handle has been finalized in another thread diff --git a/lib/votequorum.c b/lib/votequorum.c index 9922b31..fd71a23 100644 --- a/lib/votequorum.c +++ b/lib/votequorum.c @@ -776,10 +776,10 @@ cs_error_t votequorum_dispatch ( do { pthread_mutex_lock (&votequorum_inst->dispatch_mutex); - dispatch_avail = coroipcc_dispatch_recv ( - votequorum_inst->ipc_ctx, - (void *)&dispatch_data, timeout); - + dispatch_avail = coroipcc_dispatch_recv (votequorum_inst->ipc_ctx, + (void *)&dispatch_data, + sizeof dispatch_data, + timeout); /* * Handle has been finalized in another thread -- 1.6.2.rc1.285.gc5f54 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
