[Gluster-devel] Help needed with Coverity - How to remove tainted_data_argument?

Xavier Hernandez xhernandez at datalab.es
Wed Dec 17 09:24:46 UTC 2014


On 12/17/2014 09:26 AM, Niels de Vos wrote:
> On Wed, Dec 17, 2014 at 02:26:55AM -0500, Krishnan Parthasarathi wrote:
>> I was looking into a Coverity issue (CID 1228603) in GlusterFS.
>> I sent a patch[1] before I fully understood why this was an issue.
>> After searching around in the internet for explanations, I identified that
>> the core issue was that a character buffer, storing parts of a file (external I/O),
>> was marked tainted. This taint spread wherever the buffer was used. This seems
>> acceptable in the context of static analysis. How do we indicate to Coverity that
>> the 'taint' would cause no harm as speculated?
>>
>> [1] - Coverity fix attempt: http://review.gluster.org/#/c/9286/
>> [2] - CID 1228603:  Use of untrusted scalar value  (TAINTED_SCALAR):
>>        glusterd-utils.c: 2131 in glusterd_readin_file()
>
> If you visit https://scan.coverity.com/projects/987 you can request an
> account and make yourself owner of this CID (enter it in the upper right
> corner after clicking 'view defects').
>
> I agree that this is safe usage. Please mark this as 'intentional'.

I think the root cause of this particular problem is a pattern like this:

     GF_ASSERT(type <= x);

     array[type] = y

I think there are several places where this pattern is used. GF_ASSERT() 
is there to detect bugs, however it does not stop the execution, it 
simply logs the problem. So if there's really a bug and 'type' > x, we 
will do an incorrect access into the array. Additionally, if 'type' is 
obtained from a tainted pointer, coverity considers this a potential 
security issue.

This is also applicable to NULL pointer checks and some others.

Wouldn't it be better to make GF_ASSERT() to really stop the program ? 
(GF_ASSERT() should only be used for things that should never happen 
under any circumstance, and happening means something very bad has 
happened). Or at least use structures like this:

     if (type <= x) {
         array[x] = y;
     } else {
         GF_ASSERT(type <= x);
     }

Xavi


More information about the Gluster-devel mailing list