Commit 1c42c330 authored by Jeff Dike's avatar Jeff Dike

A set of small bug fixes brought over from 2.4.19-8.

parent fb28eb82
...@@ -118,7 +118,7 @@ int port_listen_fd(int port) ...@@ -118,7 +118,7 @@ int port_listen_fd(int port)
goto out; goto out;
} }
if(listen(fd, 1) < 0){ if((listen(fd, 1) < 0) || (os_set_fd_block(fd, 0))){
err = -errno; err = -errno;
goto out; goto out;
} }
...@@ -190,7 +190,8 @@ int port_connection(int fd, int *socket, int *pid_out) ...@@ -190,7 +190,8 @@ int port_connection(int fd, int *socket, int *pid_out)
"/usr/lib/uml/port-helper", NULL }; "/usr/lib/uml/port-helper", NULL };
struct port_pre_exec_data data; struct port_pre_exec_data data;
if((new = accept(fd, NULL, 0)) < 0) return(-errno); if((new = os_accept_connection(fd)) < 0)
return(-errno);
err = os_pipe(socket, 0, 0); err = os_pipe(socket, 0, 0);
if(err) goto out_close; if(err) goto out_close;
......
...@@ -9,7 +9,10 @@ struct slip_data { ...@@ -9,7 +9,10 @@ struct slip_data {
char *addr; char *addr;
char *gate_addr; char *gate_addr;
int slave; int slave;
char buf[2 * BUF_SIZE]; /* two bytes each for a (pathological) max packet of escaped chars +
* terminating END char + inital END char
*/
char buf[2 * BUF_SIZE + 2];
int pos; int pos;
int esc; int esc;
}; };
......
...@@ -61,7 +61,7 @@ void sigio_handler(int sig, struct uml_pt_regs *regs) ...@@ -61,7 +61,7 @@ void sigio_handler(int sig, struct uml_pt_regs *regs)
for(i = 0; i < pollfds_num; i++){ for(i = 0; i < pollfds_num; i++){
if(pollfds[i].revents != 0){ if(pollfds[i].revents != 0){
irq_fd->current_events = pollfds[i].revents; irq_fd->current_events = pollfds[i].revents;
pollfds[i].events = 0; pollfds[i].fd = -1;
} }
irq_fd = irq_fd->next; irq_fd = irq_fd->next;
} }
...@@ -185,7 +185,8 @@ static void free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg) ...@@ -185,7 +185,8 @@ static void free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg)
while(*prev != NULL){ while(*prev != NULL){
if((*test)(*prev, arg)){ if((*test)(*prev, arg)){
struct irq_fd *old_fd = *prev; struct irq_fd *old_fd = *prev;
if(pollfds[i].fd != (*prev)->fd){ if((pollfds[i].fd != -1) &&
(pollfds[i].fd != (*prev)->fd)){
printk("free_irq_by_cb - mismatch between " printk("free_irq_by_cb - mismatch between "
"active_fds and pollfds, fd %d vs %d\n", "active_fds and pollfds, fd %d vs %d\n",
(*prev)->fd, pollfds[i].fd); (*prev)->fd, pollfds[i].fd);
...@@ -250,7 +251,7 @@ static struct irq_fd *find_irq_by_fd(int fd, int irqnum, int *index_out) ...@@ -250,7 +251,7 @@ static struct irq_fd *find_irq_by_fd(int fd, int irqnum, int *index_out)
printk("find_irq_by_fd doesn't have descriptor %d\n", fd); printk("find_irq_by_fd doesn't have descriptor %d\n", fd);
return(NULL); return(NULL);
} }
if(pollfds[i].fd != fd){ if((pollfds[i].fd != -1) && (pollfds[i].fd != fd)){
printk("find_irq_by_fd - mismatch between active_fds and " printk("find_irq_by_fd - mismatch between active_fds and "
"pollfds, fd %d vs %d, need %d\n", irq->fd, "pollfds, fd %d vs %d, need %d\n", irq->fd,
pollfds[i].fd, fd); pollfds[i].fd, fd);
...@@ -283,7 +284,7 @@ void reactivate_fd(int fd, int irqnum) ...@@ -283,7 +284,7 @@ void reactivate_fd(int fd, int irqnum)
irq = find_irq_by_fd(fd, irqnum, &i); irq = find_irq_by_fd(fd, irqnum, &i);
if(irq == NULL) return; if(irq == NULL) return;
pollfds[i].events = irq->events; pollfds[i].fd = irq->fd;
maybe_sigio_broken(fd, irq->type); maybe_sigio_broken(fd, irq->type);
} }
...@@ -294,7 +295,7 @@ void deactivate_fd(int fd, int irqnum) ...@@ -294,7 +295,7 @@ void deactivate_fd(int fd, int irqnum)
irq = find_irq_by_fd(fd, irqnum, &i); irq = find_irq_by_fd(fd, irqnum, &i);
if(irq == NULL) return; if(irq == NULL) return;
pollfds[i].events = 0; pollfds[i].fd = -1;
} }
void forward_ipi(int fd, int pid) void forward_ipi(int fd, int pid)
......
...@@ -49,7 +49,7 @@ mmu_gather_t mmu_gathers[NR_CPUS]; ...@@ -49,7 +49,7 @@ mmu_gather_t mmu_gathers[NR_CPUS];
int kmalloc_ok = 0; int kmalloc_ok = 0;
#define NREGIONS (phys_region_index(0xffffffff) - phys_region_index(0x0)) #define NREGIONS (phys_region_index(0xffffffff) - phys_region_index(0x0) + 1)
struct mem_region *regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = NULL }; struct mem_region *regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = NULL };
#define REGION_SIZE ((0xffffffff & ~REGION_MASK) + 1) #define REGION_SIZE ((0xffffffff & ~REGION_MASK) + 1)
......
...@@ -227,12 +227,12 @@ int os_set_fd_block(int fd, int blocking) ...@@ -227,12 +227,12 @@ int os_set_fd_block(int fd, int blocking)
int os_accept_connection(int fd) int os_accept_connection(int fd)
{ {
int err; int new;
err = accept(fd, NULL, 0); new = accept(fd, NULL, 0);
if(err) if(new < 0)
return(-errno); return(-errno);
return(0); return(new);
} }
#ifndef SHUT_RD #ifndef SHUT_RD
......
#ifndef __UM_XOR_H
#define __UM_XOR_H
#include "asm-generic/xor.h"
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment