Swap only altered elements of the grouplist in getgroups() (Kirill Shutemov).
getgroups() returns the number of supplementary group IDs, so it's unnessary to swap the entire array. It can dramatically speed up the syscall: on recent Linux kernels NGROUPS_MAX=65536. Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5267 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									cb3bc23361
								
							
						
					
					
						commit
						a2155fcc65
					
				@ -5253,7 +5253,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
				
			|||||||
                target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
 | 
					                target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
 | 
				
			||||||
                if (!target_grouplist)
 | 
					                if (!target_grouplist)
 | 
				
			||||||
                    goto efault;
 | 
					                    goto efault;
 | 
				
			||||||
                for(i = 0;i < gidsetsize; i++)
 | 
					                for(i = 0;i < ret; i++)
 | 
				
			||||||
                    target_grouplist[i] = tswap16(grouplist[i]);
 | 
					                    target_grouplist[i] = tswap16(grouplist[i]);
 | 
				
			||||||
                unlock_user(target_grouplist, arg2, gidsetsize * 2);
 | 
					                unlock_user(target_grouplist, arg2, gidsetsize * 2);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -5407,7 +5407,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 | 
				
			|||||||
                    ret = -TARGET_EFAULT;
 | 
					                    ret = -TARGET_EFAULT;
 | 
				
			||||||
                    goto fail;
 | 
					                    goto fail;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                for(i = 0;i < gidsetsize; i++)
 | 
					                for(i = 0;i < ret; i++)
 | 
				
			||||||
                    target_grouplist[i] = tswap32(grouplist[i]);
 | 
					                    target_grouplist[i] = tswap32(grouplist[i]);
 | 
				
			||||||
                unlock_user(target_grouplist, arg2, gidsetsize * 4);
 | 
					                unlock_user(target_grouplist, arg2, gidsetsize * 4);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user