On Mon, Nov 08, 2010 at 06:56:16AM -0600, Hyrum K. Wright wrote:
> On Sun, Nov 7, 2010 at 11:58 AM, Stefan Sperling <s...@elego.de> wrote:
> > [[[
> > * subversion/libsvn_fs_util/caching.c
> >  (svn_fs__get_global_membuffer_cache): Fix a possible error leak.
> > ]]]
> >
> > Index: subversion/libsvn_fs_util/caching.c
> > ===================================================================
> > --- subversion/libsvn_fs_util/caching.c (revision 1032308)
> > +++ subversion/libsvn_fs_util/caching.c (working copy)
> > @@ -62,6 +62,7 @@ svn_fs__get_global_membuffer_cache(void)
> >       /* auto-allocate cache*/
> >       apr_allocator_t *allocator = NULL;
> >       apr_pool_t *pool = NULL;
> > +      svn_error_t *err;
> >
> >       if (apr_allocator_create(&allocator))
> >         return NULL;
> > @@ -75,12 +76,17 @@ svn_fs__get_global_membuffer_cache(void)
> >       apr_allocator_max_free_set(allocator, 1);
> >       pool = svn_pool_create_ex(NULL, allocator);
> >
> > -      svn_cache__membuffer_cache_create
> > -          (&cache,
> > -           (apr_size_t)cache_size,
> > -           (apr_size_t)(cache_size / 16),
> > -           ! svn_fs_get_cache_config()->single_threaded,
> > -           pool);
> 
> If we're choosing to ignore the error above, you can just wrap the
> entire call in an svn_error_clear().  No need to introduce and check a
> temp variable.

Ah, nice trick. Thanks.

> > +      err = svn_cache__membuffer_cache_create
> > +              (&cache,
> > +               (apr_size_t)cache_size,
> > +               (apr_size_t)(cache_size / 16),
> > +               ! svn_fs_get_cache_config()->single_threaded,
> > +               pool);
> > +      if (err)
> > +        {
> > +          svn_error_clear(err);
> > +          return NULL;
> > +        }
> 
> Does this early return actually change functionality?  If so, this
> patch is about more than just fixing an error leak...

It doesn't change functionality.
Cache is NULL in this case, and we return it next:

> 
> >     }
> >
> >   return cache;
> >


I'm not sure though if svn_cache__membuffer_cache_create() guarantees
that cache remains NULL in case of error. Maybe this should be
documented as such to allow callers to ignore errors this way.

New patch below, also fixing a space-before-paren and another
similar error leak.

[[[
* subversion/libsvn_fs_util/caching.c
 (svn_fs__get_global_membuffer_cache,
  svn_fs__get_global_file_handle_cache): Fix a possible error leak.
]]]

Index: subversion/libsvn_fs_util/caching.c
===================================================================
--- subversion/libsvn_fs_util/caching.c (revision 1032333)
+++ subversion/libsvn_fs_util/caching.c (working copy)
@@ -75,12 +75,12 @@ svn_fs__get_global_membuffer_cache(void)
       apr_allocator_max_free_set(allocator, 1);
       pool = svn_pool_create_ex(NULL, allocator);
 
-      svn_cache__membuffer_cache_create
-          (&cache,
-           (apr_size_t)cache_size,
-           (apr_size_t)(cache_size / 16),
-           ! svn_fs_get_cache_config()->single_threaded,
-           pool);
+      svn_error_clear(svn_cache__membuffer_cache_create(
+                        &cache,
+                        (apr_size_t)cache_size,
+                        (apr_size_t)(cache_size / 16),
+                        ! svn_fs_get_cache_config()->single_threaded,
+                        pool));
     }
 
   return cache;
@@ -96,10 +96,10 @@ svn_fs__get_global_file_handle_cache(void)
   static svn_file_handle_cache_t *cache = NULL;
 
   if (!cache)
-    svn_file_handle_cache__create_cache(&cache,
-                                        cache_settings.file_handle_count,
-                                        !cache_settings.single_threaded,
-                                        svn_pool_create(NULL));
+    svn_error_clear(svn_file_handle_cache__create_cache(
+                      &cache, cache_settings.file_handle_count, 
+                      !cache_settings.single_threaded,
+                      svn_pool_create(NULL)));
 
   return cache;
 }

Reply via email to