Type: Bug
Severity: minor
Component: VirtualBox OSE
Host: Ubuntu 64

In file src/VBox/Devices/PC/DevAPIC.cpp:

  897        case 0x0d:
  !898           val = apic->log_dest << 24;
  899            break;

In line 898 "apic->log_dest" with type "unsigned char" (8 bits, unsigned) is promoted in "apic->log_dest << 24" to 
type "int" (32 bits, signed), then sign-extended to type "unsigned long long" (64 bits, unsigned). If "apic->log_dest << 
24" is greater than 0x7FFFFFFF, the upper bits of the result will all be 1.

The same happens in the next case:
  900        case 0x0e:
  901            /* Bottom 28 bits are always 1 */
  !902           val = (apic->dest_mode << 28) | 0xfffffff;
  903            break;

In line 902 "apic->dest_mode" with type "unsigned char" (8 bits, unsigned) is promoted in "(apic->dest_mode << 28) | 
0xfffffff" to type "int" (32 bits, signed), then sign-extended to type "unsigned long long" (64 bits, unsigned). If 
"(apic->dest_mode << 28) | 0xfffffff" is greater than 0x7FFFFFFF, the upper bits of the result will all be 1.

In both cases the value should be cast to the target value (unsigned long long) 
first before shifting.

_______________________________________________
vbox-dev mailing list
[email protected]
http://vbox.innotek.de/mailman/listinfo/vbox-dev

Reply via email to