kvm, cpuid: silence a buffer overflow warning
Subsystems (4)
RFC PATCH 1/1 kvm, cpuid: silence a buffer overflow warning
This seems like a harmless off by one overflow if "i" is the last element in the vcpu->arch.cpuid_entries[] array.
---
Not tested. I always wonder if it's worth fixing these or if it's worth reporting them? Either of those seem like a lot of work for something harmless.
arch/x86/kvm/cpuid.c +1 -1
@@ -660,7 +660,7 @@ static int move_to_next_stateful_cpuid_entry(struct kvm_vcpu *vcpu, int i) e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT ;/* when no next entry is found, the current entry[i] is reselected */ -for (j = i +1 ; ; j = (j +1 ) % nent) { +for (j = (i +1 ) % nent; ; j = (j +1 ) % nent) {struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j];if (ej->function = e->function) { ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ;
Paolo Bonzini
maintainerIl 20/02/2014 13:34, Dan Carpenter ha scritto:
Quoted 8 lines
This seems like a harmless off by one overflow if "i" is the last element in the vcpu->arch.cpuid_entries[] array.
Signed-off-by Dan Carpenter <[email protected]>---
Not tested. I always wonder if it's worth fixing these or if it's worth reporting them? Either of those seem like a lot of work for something harmless.
Could it oops if cpuid_nent is INT_MAX? If so, it's not entirely harmless. In this case I'd rather take the occasion to cleanup the code like this (compile-tested):
arch/x86/kvm/cpuid.c +10 -9
@@ -656,18 +656,19 @@ out:static int move_to_next_stateful_cpuid_entry (struct kvm_vcpu *vcpu,int i) {struct kvm_cpuid_entry2 *e = &vcpu->arch.cpuid_entries[i]; -int j, nent = vcpu->arch.cpuid_nent; +struct kvm_cpuid_entry2 *ej; +int j = i, nent = vcpu->arch.cpuid_nent; e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT ; +/* when no next entry is found, the current entry[i] is reselected */ -for (j = i +1 ; ; j = (j +1 ) % nent) { -struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j]; -if (ej->function = e->function) { - ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; -return j; - } - } -return 0 ;/* silence gcc, even though control never reaches here */ +do { + j = (j +1 ) % nent; + ej = &vcpu->arch.cpuid_entries[j]; + }while (ej->function != e->function); + + ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; +return j; }/* find an entry with matching function, matching index (if needed), and that
What do you think?
Paolo
Am 20.02.2014 14:07, schrieb Paolo Bonzini:
Quoted 48 lines
Il 20/02/2014 13:34, Dan Carpenter ha scritto:
Quoted 8 lines
This seems like a harmless off by one overflow if "i" is the last element in the vcpu->arch.cpuid_entries[] array.
Signed-off-by Dan Carpenter <[email protected]>---
Not tested. I always wonder if it's worth fixing these or if it's worth reporting them? Either of those seem like a lot of work for something harmless.Could it oops if
cpuid_nentisINT_MAX? If so, it's not entirely harmless. In this case I'd rather take the occasion to cleanup the code like this (compile-tested):arch/x86/kvm/cpuid.c +10
-9@@ -656,18 +656,19 @@ out:static int move_to_next_stateful_cpuid_entry (struct kvm_vcpu *vcpu,int i) {struct kvm_cpuid_entry2 *e = &vcpu->arch.cpuid_entries[i]; -int j, nent = vcpu->arch.cpuid_nent; +struct kvm_cpuid_entry2 *ej; +int j = i, nent = vcpu->arch.cpuid_nent; e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT ; +/* when no next entry is found, the current entry[i] is reselected */ -for (j = i +1 ; ; j = (j +1 ) % nent) { -struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j]; -if (ej->function = e->function) { - ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; -return j; - } - } -return 0 ;/* silence gcc, even though control never reaches here */ +do { + j = (j +1 ) % nent; + ej = &vcpu->arch.cpuid_entries[j]; + }while (ej->function != e->function); + + ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; +return j; }/* find an entry with matching function, matching index (if needed), and that
Quoted 2 lines
What do you think?
Is there any guaranty that this will not loop forever ?
an if (i=j) return 0; would be on the save side. (I guess that these was the idea behind the for).
re,
wh
Quoted 6 lines
Paolo
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Paolo Bonzini
maintainerIl 20/02/2014 14:18, walter harms ha scritto:
Quoted 51 lines
Am 20.02.2014 14:07, schrieb Paolo Bonzini:
Quoted 48 lines
Il 20/02/2014 13:34, Dan Carpenter ha scritto:
Quoted 8 lines
This seems like a harmless off by one overflow if "i" is the last element in the vcpu->arch.cpuid_entries[] array.
Signed-off-by Dan Carpenter <[email protected]>---
Not tested. I always wonder if it's worth fixing these or if it's worth reporting them? Either of those seem like a lot of work for something harmless.Could it oops if
cpuid_nentisINT_MAX? If so, it's not entirely harmless. In this case I'd rather take the occasion to cleanup the code like this (compile-tested):arch/x86/kvm/cpuid.c +10
-9@@ -656,18 +656,19 @@ out:static int move_to_next_stateful_cpuid_entry (struct kvm_vcpu *vcpu,int i) {struct kvm_cpuid_entry2 *e = &vcpu->arch.cpuid_entries[i]; -int j, nent = vcpu->arch.cpuid_nent; +struct kvm_cpuid_entry2 *ej; +int j = i, nent = vcpu->arch.cpuid_nent; e->flags &= ~KVM_CPUID_FLAG_STATE_READ_NEXT ; +/* when no next entry is found, the current entry[i] is reselected */ -for (j = i +1 ; ; j = (j +1 ) % nent) { -struct kvm_cpuid_entry2 *ej = &vcpu->arch.cpuid_entries[j]; -if (ej->function = e->function) { - ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; -return j; - } - } -return 0 ;/* silence gcc, even though control never reaches here */ +do { + j = (j +1 ) % nent; + ej = &vcpu->arch.cpuid_entries[j]; + }while (ej->function != e->function); + + ej->flags |=KVM_CPUID_FLAG_STATE_READ_NEXT ; +return j; }/* find an entry with matching function, matching index (if needed), and that
Quoted 7 lines
Quoted 2 lines
What do you think?
Is there any guaranty that this will not loop forever ?
an if (i=j) return 0; would be on the save side. (I guess that these was the idea behind the for).
Once i=j you'll get ej->function = e->function and exit.
Paolo
Quoted 11 lines · Paolo Bonzini
Il 20/02/2014 13:34, Dan Carpenter ha scritto:
Quoted 8 lines
This seems like a harmless off by one overflow if "i" is the last element in the vcpu->arch.cpuid_entries[] array.
Signed-off-by Dan Carpenter <[email protected]>---
Not tested. I always wonder if it's worth fixing these or if it's worth reporting them? Either of those seem like a lot of work for something harmless.Could it oops if
cpuid_nentisINT_MAX?
cpuid_nent is capped at KVM_MAX_CPUID_ENTRIES (80).
regards,
dan carpenter