rrproviderproperty.c: free newly allocated prop in more error paths

Reported by parfait 1.0:

Error: Memory leak (CWE 401)
   Memory leak of pointer 'prop' allocated with RRCreateProviderProperty(property)
        at line 221 of randr/rrproviderproperty.c in function 'RRChangeProviderProperty'.
          'prop' allocated at line 155 with RRCreateProviderProperty(property).
          prop leaks when pending != 0 at line 161.

Error: Memory leak (CWE 401)
   Memory leak of pointer 'prop' allocated with RRCreateProviderProperty(property)
        at line 345 of randr/rrproviderproperty.c in function 'RRConfigureProviderProperty'.
          'prop' allocated at line 333 with RRCreateProviderProperty(property).
        at line 349 of randr/rrproviderproperty.c in function 'RRConfigureProviderProperty'.
          'prop' allocated at line 333 with RRCreateProviderProperty(property).

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Alan Coopersmith 2012-07-10 23:29:53 -07:00
parent 94b514d5e4
commit 42e655de4d

View File

@ -216,6 +216,8 @@ RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
if (pending && pScrPriv->rrProviderSetProperty && if (pending && pScrPriv->rrProviderSetProperty &&
!pScrPriv->rrProviderSetProperty(provider->pScreen, provider, !pScrPriv->rrProviderSetProperty(provider->pScreen, provider,
prop->propertyName, &new_value)) { prop->propertyName, &new_value)) {
if (add)
RRDestroyProviderProperty(prop);
free(new_value.data); free(new_value.data);
return BadValue; return BadValue;
} }
@ -342,12 +344,18 @@ RRConfigureProviderProperty(RRProviderPtr provider, Atom property,
/* /*
* ranges must have even number of values * ranges must have even number of values
*/ */
if (range && (num_values & 1)) if (range && (num_values & 1)) {
if (add)
RRDestroyProviderProperty(prop);
return BadMatch; return BadMatch;
}
new_values = malloc(num_values * sizeof(INT32)); new_values = malloc(num_values * sizeof(INT32));
if (!new_values && num_values) if (!new_values && num_values) {
if (add)
RRDestroyProviderProperty(prop);
return BadAlloc; return BadAlloc;
}
if (num_values) if (num_values)
memcpy(new_values, values, num_values * sizeof(INT32)); memcpy(new_values, values, num_values * sizeof(INT32));