Re: [PATCH] objdb: Don't read uninitialized memory in inc/dec

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



ACK

On 11/27/2012 1:07 PM, Jan Friesse wrote:
> When object_key_increment or _decrement is called on [u]int16 value,
> uninitialized value is read as result value.
> 
> Solution is to read really only 16-bits.
> 
> Signed-off-by: Jan Friesse <jfriesse@xxxxxxxxxx>
> ---
>  exec/objdb.c |   24 ++++++++++++++----------
>  1 files changed, 14 insertions(+), 10 deletions(-)
> 
> diff --git a/exec/objdb.c b/exec/objdb.c
> index baadda3..5d7c124 100644
> --- a/exec/objdb.c
> +++ b/exec/objdb.c
> @@ -1100,26 +1100,33 @@ static int object_key_increment (
>  		switch (object_key->value_type) {
>  		case OBJDB_VALUETYPE_INT16:
>  			(*(int16_t *)object_key->value)++;
> +			*value = *(int16_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT16:
>  			(*(uint16_t *)object_key->value)++;
> +			*value = *(uint16_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_INT32:
>  			(*(int32_t *)object_key->value)++;
> +			*value = *(int32_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT32:
>  			(*(uint32_t *)object_key->value)++;
> +			*value = *(uint32_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_INT64:
>  			(*(int64_t *)object_key->value)++;
> +			*value = *(int64_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT64:
>  			(*(uint64_t *)object_key->value)++;
> +			*value = *(uint64_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_ANY:
>  			/* for backwards compatibilty */
>  			if (object_key->value_len == sizeof(int)) {
>  				(*(int *)object_key->value)++;
> +				*value = *(int *)object_key->value;
>  			}
>  			else {
>  				res = -1;
> @@ -1129,11 +1136,6 @@ static int object_key_increment (
>  			res = -1;
>  			break;
>  		}
> -		if (res == 0) {
> -			/* nasty, not sure why we need to return this typed
> -			 * instead of void* */
> -			*value = *(int *)object_key->value;
> -		}
>  	}
>  	else {
>  		res = -1;
> @@ -1187,26 +1189,33 @@ static int object_key_decrement (
>  		switch (object_key->value_type) {
>  		case OBJDB_VALUETYPE_INT16:
>  			(*(int16_t *)object_key->value)--;
> +			*value = *(int16_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT16:
>  			(*(uint16_t *)object_key->value)--;
> +			*value = *(uint16_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_INT32:
>  			(*(int32_t *)object_key->value)--;
> +			*value = *(int32_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT32:
>  			(*(uint32_t *)object_key->value)--;
> +			*value = *(uint32_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_INT64:
>  			(*(int64_t *)object_key->value)--;
> +			*value = *(int64_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_UINT64:
>  			(*(uint64_t *)object_key->value)--;
> +			*value = *(uint64_t *)object_key->value;
>  			break;
>  		case OBJDB_VALUETYPE_ANY:
>  			/* for backwards compatibilty */
>  			if (object_key->value_len == sizeof(int)) {
>  				(*(int *)object_key->value)--;
> +				*value = *(int *)object_key->value;
>  			}
>  			else {
>  				res = -1;
> @@ -1216,11 +1225,6 @@ static int object_key_decrement (
>  			res = -1;
>  			break;
>  		}
> -		if (res == 0) {
> -			/* nasty, not sure why we need to return this typed
> -			 * instead of void* */
> -			*value = *(int *)object_key->value;
> -		}
>  	}
>  	else {
>  		res = -1;
> 

_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux