diff -urN 2.2.16pre1/drivers/char/nvram.c serial-proc/drivers/char/nvram.c --- 2.2.16pre1/drivers/char/nvram.c Mon Jan 17 16:44:37 2000 +++ serial-proc/drivers/char/nvram.c Wed May 3 20:02:39 2000 @@ -373,7 +373,7 @@ if (offset >= begin + len) return( 0 ); - *start = buffer + (begin - offset); + *start = buffer + (offset - begin); return( size < begin + len - offset ? size : begin + len - offset ); } diff -urN 2.2.16pre1/drivers/char/serial.c serial-proc/drivers/char/serial.c --- 2.2.16pre1/drivers/char/serial.c Wed May 3 19:58:36 2000 +++ serial-proc/drivers/char/serial.c Wed May 3 20:03:43 2000 @@ -2782,29 +2782,31 @@ return ret; } -int rs_read_proc(char *page, char **start, off_t off, int count, +int rs_read_proc(char *page, char **start, off_t idx, ssize_t count, int *eof, void *data) { - int i, len = 0, l; - off_t begin = 0; + int n; - len += sprintf(page, "serinfo:1.0 driver:%s\n", serial_version); - for (i = 0; i < NR_PORTS && len < 3900; i++) { - l = line_info(page + len, &rs_table[i]); - len += l; - if (len+begin > off+count) - goto done; - if (len+begin < off) { - begin += len; - len = 0; - } + *start = (char *) 1L; + + if (!idx) { + n = sprintf(page, "serinfo:1.0 driver:%s\n", serial_version); + goto out; } - *eof = 1; -done: - if (off >= len+begin) - return 0; - *start = page + (off-begin); - return ((count < begin+len-off) ? count : begin+len-off); + idx--; + + n = 0; + if (idx >= NR_PORTS || idx < 0) + goto out; + + n = line_info(page, &rs_table[idx]); + if (idx + 1 == NR_PORTS) + *eof = 1; + + out: + if (n > count) + n = 0; + return n; } /* diff -urN 2.2.16pre1/fs/proc/generic.c serial-proc/fs/proc/generic.c --- 2.2.16pre1/fs/proc/generic.c Mon Jan 17 16:44:43 2000 +++ serial-proc/fs/proc/generic.c Wed May 3 20:02:39 2000 @@ -198,9 +198,13 @@ { switch (orig) { case 0: + if (offset < 0) + return -EINVAL; file->f_pos = offset; return(file->f_pos); case 1: + if (offset + file->f_pos < 0) + return -EINVAL; file->f_pos += offset; return(file->f_pos); case 2: diff -urN 2.2.16pre1/net/irda/ircomm/ircomm_tty.c serial-proc/net/irda/ircomm/ircomm_tty.c --- 2.2.16pre1/net/irda/ircomm/ircomm_tty.c Fri Apr 21 15:59:25 2000 +++ serial-proc/net/irda/ircomm/ircomm_tty.c Wed May 3 20:02:40 2000 @@ -1347,7 +1347,7 @@ done: if (offset >= count+begin) return 0; - *start = buf + (begin-offset); + *start = buf + (offset-begin); return ((len < begin+count-offset) ? len : begin+count-offset); }