* Elena Reshetova <elena.reshet...@intel.com> wrote:

> @@ -19,10 +19,15 @@ static int sgx_open(struct inode *inode, struct file 
> *file)
>       struct sgx_encl *encl;
>       int ret;
>  
> +     ret = sgx_inc_usage_count();
> +     if (ret)
> +             return -EBUSY;

So if sgx_inc_usage_count() returns nonzero, it's in use already and we 
return -EBUSY, right?

But:

>  int sgx_inc_usage_count(void)
>  {
> +     int ret;
> +
> +     /*
> +      * Increments from non-zero indicate EPC other
> +      * active EPC users and EUPDATESVN is not attempted.
> +      */
> +     if (atomic64_inc_not_zero(&sgx_usage_count))
> +             return 0;

If sgx_usage_count is 1 here (ie. it's busy), this will return *zero*, 
and sgx_open() will not run into the -EBUSY condition and will continue 
assuming it has claimed the usage count, while it hasn't ...

Furthermore, in the sgx_open() error paths we can then run into 
sgx_dec_usage_count(), which will merrily underflow the counter into 
negative:

 +void sgx_dec_usage_count(void)
 +{
 +       atomic64_dec(&sgx_usage_count);
 +}

How is this all supposed to work?

Thanks,

        Ingo

Reply via email to