You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by tr...@apache.org on 2009/11/14 04:02:29 UTC
svn commit: r836105 - in /apr/apr/branches/1.4.x/poll/unix: pollcb.c
pollset.c
Author: trawick
Date: Sat Nov 14 03:02:29 2009
New Revision: 836105
URL: http://svn.apache.org/viewvc?rev=836105&view=rev
Log:
merge r834029 from trunk:
apr_pollset_create_ex(), apr_pollcb_create_ex():
simplify logic to update the caller's pollcb/pollset ptr,
fixing a apr_pollcb_create_ex() crash in one of the
fall-back paths which was reported by Neil Conway
Modified:
apr/apr/branches/1.4.x/poll/unix/pollcb.c
apr/apr/branches/1.4.x/poll/unix/pollset.c
Modified: apr/apr/branches/1.4.x/poll/unix/pollcb.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/poll/unix/pollcb.c?rev=836105&r1=836104&r2=836105&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/poll/unix/pollcb.c (original)
+++ apr/apr/branches/1.4.x/poll/unix/pollcb.c Sat Nov 14 03:02:29 2009
@@ -72,21 +72,23 @@
return provider;
}
-APR_DECLARE(apr_status_t) apr_pollcb_create_ex(apr_pollcb_t **pollcb,
+APR_DECLARE(apr_status_t) apr_pollcb_create_ex(apr_pollcb_t **ret_pollcb,
apr_uint32_t size,
apr_pool_t *p,
apr_uint32_t flags,
apr_pollset_method_e method)
{
apr_status_t rv;
+ apr_pollcb_t *pollcb;
apr_pollcb_provider_t *provider = NULL;
+ *ret_pollcb = NULL;
+
if (method == APR_POLLSET_DEFAULT)
method = pollset_default_method;
while (provider == NULL) {
provider = pollcb_provider(method);
if (!provider) {
- *pollcb = NULL;
if ((flags & APR_POLLSET_NODEFAULT) == APR_POLLSET_NODEFAULT)
return APR_ENOTIMPL;
if (method == pollset_default_method)
@@ -95,15 +97,14 @@
}
}
- *pollcb = apr_palloc(p, sizeof(**pollcb));
- (*pollcb)->nelts = 0;
- (*pollcb)->nalloc = size;
- (*pollcb)->pool = p;
- (*pollcb)->provider = provider;
+ pollcb = apr_palloc(p, sizeof(*pollcb));
+ pollcb->nelts = 0;
+ pollcb->nalloc = size;
+ pollcb->pool = p;
+ pollcb->provider = provider;
- rv = (*provider->create)(*pollcb, size, p, flags);
+ rv = (*provider->create)(pollcb, size, p, flags);
if (rv == APR_ENOTIMPL) {
- *pollcb = NULL;
if (method == pollset_default_method) {
return rv;
}
@@ -117,13 +118,14 @@
if (!provider) {
return APR_ENOTIMPL;
}
- rv = (*provider->create)(*pollcb, size, p, flags);
+ rv = (*provider->create)(pollcb, size, p, flags);
if (rv != APR_SUCCESS) {
return rv;
}
- (*pollcb)->provider = provider;
+ pollcb->provider = provider;
}
+ *ret_pollcb = pollcb;
return APR_SUCCESS;
}
Modified: apr/apr/branches/1.4.x/poll/unix/pollset.c
URL: http://svn.apache.org/viewvc/apr/apr/branches/1.4.x/poll/unix/pollset.c?rev=836105&r1=836104&r2=836105&view=diff
==============================================================================
--- apr/apr/branches/1.4.x/poll/unix/pollset.c (original)
+++ apr/apr/branches/1.4.x/poll/unix/pollset.c Sat Nov 14 03:02:29 2009
@@ -210,21 +210,23 @@
return provider;
}
-APR_DECLARE(apr_status_t) apr_pollset_create_ex(apr_pollset_t **pollset,
+APR_DECLARE(apr_status_t) apr_pollset_create_ex(apr_pollset_t **ret_pollset,
apr_uint32_t size,
apr_pool_t *p,
apr_uint32_t flags,
apr_pollset_method_e method)
{
apr_status_t rv;
+ apr_pollset_t *pollset;
apr_pollset_provider_t *provider = NULL;
+ *ret_pollset = NULL;
+
if (method == APR_POLLSET_DEFAULT)
method = pollset_default_method;
while (provider == NULL) {
provider = pollset_provider(method);
if (!provider) {
- *pollset = NULL;
if ((flags & APR_POLLSET_NODEFAULT) == APR_POLLSET_NODEFAULT)
return APR_ENOTIMPL;
if (method == pollset_default_method)
@@ -237,41 +239,39 @@
size++;
}
- *pollset = apr_palloc(p, sizeof(**pollset));
- (*pollset)->nelts = 0;
- (*pollset)->nalloc = size;
- (*pollset)->pool = p;
- (*pollset)->flags = flags;
- (*pollset)->provider = provider;
+ pollset = apr_palloc(p, sizeof(*pollset));
+ pollset->nelts = 0;
+ pollset->nalloc = size;
+ pollset->pool = p;
+ pollset->flags = flags;
+ pollset->provider = provider;
- rv = (*provider->create)(*pollset, size, p, flags);
+ rv = (*provider->create)(pollset, size, p, flags);
if (rv == APR_ENOTIMPL) {
if (method == pollset_default_method) {
- *pollset = NULL;
return rv;
}
provider = pollset_provider(pollset_default_method);
if (!provider) {
- *pollset = NULL;
return APR_ENOTIMPL;
}
- rv = (*provider->create)(*pollset, size, p, flags);
+ rv = (*provider->create)(pollset, size, p, flags);
if (rv != APR_SUCCESS) {
- *pollset = NULL;
return rv;
}
- (*pollset)->provider = provider;
+ pollset->provider = provider;
}
if (flags & APR_POLLSET_WAKEABLE) {
/* Create wakeup pipe */
- if ((rv = create_wakeup_pipe(*pollset)) != APR_SUCCESS) {
- *pollset = NULL;
+ if ((rv = create_wakeup_pipe(pollset)) != APR_SUCCESS) {
return rv;
}
}
if ((flags & APR_POLLSET_WAKEABLE) || provider->cleanup)
- apr_pool_cleanup_register(p, *pollset, pollset_cleanup,
+ apr_pool_cleanup_register(p, pollset, pollset_cleanup,
apr_pool_cleanup_null);
+
+ *ret_pollset = pollset;
return APR_SUCCESS;
}