linux-user: correct msgrcv()
All parameters must be swapped before the call of do_msgrcv(). Allow faked (debian fakeroot daemon) to work properly. WITHOUT this patch: $ faked-sysv --foreground --debug using 1723744788 as msg key msg_key=1723744788 1723744788:431 FAKEROOT: msg=131072, key=1723744788 FAKEROOT: r=-1, received message type=-150996052, message=-160219330 FAKEROOT, get_msg: Bad address r=14, EINTR=4 fakeroot: clearing up message queues and semaphores, signal=-1 fakeroot: database save FAILED WITH this patch: $ faked-sysv --foreground --debug using 1569385744 as msg key msg_key=1569385744 1569385744:424 FAKEROOT: msg=0, key=1569385744 ^C fakeroot: clearing up message queues and semaphores, signal=2 fakeroot: database save FAILED Signed-off-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
							parent
							
								
									4c37ef0223
								
							
						
					
					
						commit
						79dd77de12
					
				@ -2897,7 +2897,7 @@ static inline abi_long do_msgrcv(int msqid, abi_long msgp,
 | 
				
			|||||||
        return -TARGET_EFAULT;
 | 
					        return -TARGET_EFAULT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    host_mb = g_malloc(msgsz+sizeof(long));
 | 
					    host_mb = g_malloc(msgsz+sizeof(long));
 | 
				
			||||||
    ret = get_errno(msgrcv(msqid, host_mb, msgsz, tswapal(msgtyp), msgflg));
 | 
					    ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (ret > 0) {
 | 
					    if (ret > 0) {
 | 
				
			||||||
        abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
 | 
					        abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
 | 
				
			||||||
@ -3189,7 +3189,7 @@ static abi_long do_ipc(unsigned int call, int first,
 | 
				
			|||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                ret = do_msgrcv(first, tmp->msgp, second, tmp->msgtyp, third);
 | 
					                ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                unlock_user_struct(tmp, ptr, 0);
 | 
					                unlock_user_struct(tmp, ptr, 0);
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user