On 01/19/16 16:13, Burigo, Arthur Crippa wrote:
> Although the function qsort receives as an argument a "compare" function
> which returns an "int", QuickSortWorker (the function used internally by
> qsort to do its job) receives as an argument a "CompareFunction" which
> returns an "INTN". In a 32-bit machine, "INTN" is defined as "INT32",
> which is defined as "int" and everything works well. However, when qsort
> is compiled for a 64-bit machine, "INTN" is defined as "INT64" and the
> return values of the compare functions become incompatible ("int" for
> qsort and "INT64" for QuickSortWorker), causing malfunction.
> 
> For example, let's assume qsort is being compiled for a 64-bit machine.
> As stated before, the "compare" function will be returning an "int", and
> "CompareFunction" will be returning an "INT64". When, for example, the
> "compare" function (which was passed as an argument to qsort and, then,
> re-passed as an argument to QuickSortWorker) returns -1 (or 0xffffffff,
> in a 32-bit integer, its original return type) from inside a call to
> QuickSortWorker, its return value is interpreted as being an "INT64"
> value - which turns out to be 4294967295 (or 0x00000000ffffffff, in a
> 64-bit integer) -, making the function QuickSortWorker to behave
> unexpectedly.
> 
> Note that this unexpected (or incorrect) conversion does not happen when
> casting an "INT32" to an "INT64" directly, but does happen when casting
> function types.
> 
> The issue is fixed by changing the return type of SORT_COMPARE (the type
> of "CompareFunction", used by QuickSortWorker) from "INTN" to "int".
> This way, both qsort and QuickSortWorker use compatible definitions for
> their compare functions.
> 
> Cc: Qin Long <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Acked-by: Paulo Alcantara Cavalcanti <[email protected]>
> Signed-off-by: Karyne Mayer <[email protected]>
> Signed-off-by: Rodrigo Dias Correa <[email protected]>
> Signed-off-by: Arthur Crippa Burigo <[email protected]>
> ---
>  CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c 
> b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
> index fb446b6..f2c8987 100644
> --- a/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
> +++ b/CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
> @@ -22,7 +22,7 @@ FILE  *stdin  = NULL;
>  FILE  *stdout = NULL;
>  
>  typedef
> -INTN
> +int
>  (*SORT_COMPARE)(
>    IN  VOID  *Buffer1,
>    IN  VOID  *Buffer2
> 

INT32 is more idiomatic for edk2, I think.

Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to