]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libfrog: add missing per-thread variable error handling
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 17 Oct 2019 02:35:24 +0000 (22:35 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 17 Oct 2019 02:35:24 +0000 (22:35 -0400)
Add missing return value checks for everything that the per-thread
variable code calls.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libfrog/ptvar.c

index b8e4d4f0e8bb1f89a8da9480b5050c75082a9a2b..f375df3aec1e571618560820af4ca47402c40850 100644 (file)
@@ -44,8 +44,12 @@ ptvar_alloc(
        int             ret;
 
 #ifdef _SC_LEVEL1_DCACHE_LINESIZE
+       long            l1_dcache;
+
        /* Try to prevent cache pingpong by aligning to cacheline size. */
-       size = max(size, sysconf(_SC_LEVEL1_DCACHE_LINESIZE));
+       l1_dcache = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
+       if (l1_dcache > 0)
+               size = roundup(size, l1_dcache);
 #endif
 
        ptv = malloc(PTVAR_SIZE(nr, size));
@@ -88,17 +92,26 @@ ptvar_get(
        int             *retp)
 {
        void            *p;
+       int             ret;
 
        p = pthread_getspecific(ptv->key);
        if (!p) {
                pthread_mutex_lock(&ptv->lock);
                assert(ptv->nr_used < ptv->nr_counters);
                p = &ptv->data[(ptv->nr_used++) * ptv->data_size];
-               pthread_setspecific(ptv->key, p);
+               ret = pthread_setspecific(ptv->key, p);
+               if (ret)
+                       goto out_unlock;
                pthread_mutex_unlock(&ptv->lock);
        }
        *retp = 0;
        return p;
+
+out_unlock:
+       ptv->nr_used--;
+       pthread_mutex_unlock(&ptv->lock);
+       *retp = ret;
+       return NULL;
 }
 
 /* Iterate all of the per-thread variables. */