linux-user: Fix error handling in target_to_host_semarray()
Fix two issues in error handling in target_to_host_semarray(): * don't leak the host_array buffer if lock_user fails * return an error if malloc() fails v2: added missing * -Riku Voipio Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
fff8c539bd
commit
69d4c703a5
@ -2430,10 +2430,15 @@ static inline abi_long target_to_host_semarray(int semid, unsigned short **host_
|
|||||||
nsems = semid_ds.sem_nsems;
|
nsems = semid_ds.sem_nsems;
|
||||||
|
|
||||||
*host_array = malloc(nsems*sizeof(unsigned short));
|
*host_array = malloc(nsems*sizeof(unsigned short));
|
||||||
|
if (!*host_array) {
|
||||||
|
return -TARGET_ENOMEM;
|
||||||
|
}
|
||||||
array = lock_user(VERIFY_READ, target_addr,
|
array = lock_user(VERIFY_READ, target_addr,
|
||||||
nsems*sizeof(unsigned short), 1);
|
nsems*sizeof(unsigned short), 1);
|
||||||
if (!array)
|
if (!array) {
|
||||||
|
free(*host_array);
|
||||||
return -TARGET_EFAULT;
|
return -TARGET_EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
for(i=0; i<nsems; i++) {
|
for(i=0; i<nsems; i++) {
|
||||||
__get_user((*host_array)[i], &array[i]);
|
__get_user((*host_array)[i], &array[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user