linux-user: Consistently return host errnos from do_openat()
The function do_openat() is not consistent about whether it is returning a host errno or a guest errno in case of failure. Standardise on returning -1 with errno set (ie caller has to call get_errno()). Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reported-by: Timothy Edward Baldwin <T.E.Baldwin99@members.leeds.ac.uk> Signed-off-by: Riku Voipio <riku.voipio@linaro.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
		
							parent
							
								
									2466119c95
								
							
						
					
					
						commit
						a3ca7bb259
					
				@ -5559,7 +5559,9 @@ static int open_self_cmdline(void *cpu_env, int fd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        nb_read = read(fd_orig, buf, sizeof(buf));
 | 
					        nb_read = read(fd_orig, buf, sizeof(buf));
 | 
				
			||||||
        if (nb_read < 0) {
 | 
					        if (nb_read < 0) {
 | 
				
			||||||
 | 
					            int e = errno;
 | 
				
			||||||
            fd_orig = close(fd_orig);
 | 
					            fd_orig = close(fd_orig);
 | 
				
			||||||
 | 
					            errno = e;
 | 
				
			||||||
            return -1;
 | 
					            return -1;
 | 
				
			||||||
        } else if (nb_read == 0) {
 | 
					        } else if (nb_read == 0) {
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@ -5579,7 +5581,9 @@ static int open_self_cmdline(void *cpu_env, int fd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if (word_skipped) {
 | 
					        if (word_skipped) {
 | 
				
			||||||
            if (write(fd, cp_buf, nb_read) != nb_read) {
 | 
					            if (write(fd, cp_buf, nb_read) != nb_read) {
 | 
				
			||||||
 | 
					                int e = errno;
 | 
				
			||||||
                close(fd_orig);
 | 
					                close(fd_orig);
 | 
				
			||||||
 | 
					                errno = e;
 | 
				
			||||||
                return -1;
 | 
					                return -1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -5599,7 +5603,7 @@ static int open_self_maps(void *cpu_env, int fd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    fp = fopen("/proc/self/maps", "r");
 | 
					    fp = fopen("/proc/self/maps", "r");
 | 
				
			||||||
    if (fp == NULL) {
 | 
					    if (fp == NULL) {
 | 
				
			||||||
        return -EACCES;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while ((read = getline(&line, &len, fp)) != -1) {
 | 
					    while ((read = getline(&line, &len, fp)) != -1) {
 | 
				
			||||||
@ -5743,7 +5747,7 @@ static int open_net_route(void *cpu_env, int fd)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    fp = fopen("/proc/net/route", "r");
 | 
					    fp = fopen("/proc/net/route", "r");
 | 
				
			||||||
    if (fp == NULL) {
 | 
					    if (fp == NULL) {
 | 
				
			||||||
        return -EACCES;
 | 
					        return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* read header */
 | 
					    /* read header */
 | 
				
			||||||
@ -5793,7 +5797,7 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (is_proc_myself(pathname, "exe")) {
 | 
					    if (is_proc_myself(pathname, "exe")) {
 | 
				
			||||||
        int execfd = qemu_getauxval(AT_EXECFD);
 | 
					        int execfd = qemu_getauxval(AT_EXECFD);
 | 
				
			||||||
        return execfd ? execfd : get_errno(sys_openat(dirfd, exec_path, flags, mode));
 | 
					        return execfd ? execfd : sys_openat(dirfd, exec_path, flags, mode);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (fake_open = fakes; fake_open->filename; fake_open++) {
 | 
					    for (fake_open = fakes; fake_open->filename; fake_open++) {
 | 
				
			||||||
@ -5819,7 +5823,9 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
 | 
				
			|||||||
        unlink(filename);
 | 
					        unlink(filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((r = fake_open->fill(cpu_env, fd))) {
 | 
					        if ((r = fake_open->fill(cpu_env, fd))) {
 | 
				
			||||||
 | 
					            int e = errno;
 | 
				
			||||||
            close(fd);
 | 
					            close(fd);
 | 
				
			||||||
 | 
					            errno = e;
 | 
				
			||||||
            return r;
 | 
					            return r;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        lseek(fd, 0, SEEK_SET);
 | 
					        lseek(fd, 0, SEEK_SET);
 | 
				
			||||||
@ -5827,7 +5833,7 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
 | 
				
			|||||||
        return fd;
 | 
					        return fd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return get_errno(sys_openat(dirfd, path(pathname), flags, mode));
 | 
					    return sys_openat(dirfd, path(pathname), flags, mode);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TIMER_MAGIC 0x0caf0000
 | 
					#define TIMER_MAGIC 0x0caf0000
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user