Hi Daniel,

On Thu, May 17, 2018 at 02:05:28PM -0400, Daniel Corbett wrote:
> Hello,
> 
> When using table_* converters ref_cnt was incremented
> and never decremented causing entries to not expire.
> 
> The root cause appears to be that stktable_lookup_key()
> was called within all sample_conv_table_* functions which was
> incrementing ref_cnt and not decrementing after completion.
> 
> Added stktable_release() to the end of each sample_conv_table_*
> function.

Interesting one! However it's not correct, it doesn't decrement the
refcount on the return 0 path so the problem remains when a data
type is looked up in a table where it is not stored. For example :

        ts = stktable_lookup_key(t, key);

  ## ref_cnt incremented here only if ts != NULL

        smp->flags = SMP_F_VOL_TEST;
        smp->data.type = SMP_T_SINT;
        smp->data.u.sint = 0;

        if (!ts) /* key not present */
                return 1;

        ptr = stktable_data_ptr(t, ts, STKTABLE_DT_CONN_CUR);
        if (!ptr)

  ## here it's not decremented

                return 0; /* parameter not stored */

        smp->data.u.sint = stktable_data_cast(ptr, conn_cur);
  +     stktable_release(t, ts);
        return 1;

Given that all functions seem to be written the same way, I suggest
that we change the end and invert the !ptr condition to centralize
the release call. It would give this above :

        ptr = stktable_data_ptr(t, ts, STKTABLE_DT_CONN_CUR);
        if (ptr)
                smp->data.u.sint = stktable_data_cast(ptr, conn_cur);
        stktable_release(t, ts);
        return !!ptr;

Could you please rework your patch to do this so that I can merge it ?

Thanks!
Willy

Reply via email to