pipe_write() has an orig_resid = uio->uio_resid(). So orig_resid better
be a size_t also. Looks good otherwise.

ok with the updated diff below?

Index: kern/sys_pipe.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_pipe.c,v
retrieving revision 1.71
diff -u -p -r1.71 sys_pipe.c
--- kern/sys_pipe.c     6 Jan 2016 17:59:30 -0000       1.71
+++ kern/sys_pipe.c     15 Jan 2016 04:32:25 -0000
@@ -297,8 +297,7 @@ pipe_read(struct file *fp, off_t *poff, 
 {
        struct pipe *rpipe = fp->f_data;
        int error;
-       int nread = 0;
-       int size;
+       size_t size, nread = 0;
 
        error = pipelock(rpipe);
        if (error)
@@ -316,7 +315,7 @@ pipe_read(struct file *fp, off_t *poff, 
                                size = rpipe->pipe_buffer.cnt;
                        if (size > uio->uio_resid)
                                size = uio->uio_resid;
-                       error = 
uiomovei(&rpipe->pipe_buffer.buffer[rpipe->pipe_buffer.out],
+                       error = 
uiomove(&rpipe->pipe_buffer.buffer[rpipe->pipe_buffer.out],
                                        size, uio);
                        if (error) {
                                break;
@@ -413,7 +412,7 @@ int
 pipe_write(struct file *fp, off_t *poff, struct uio *uio, struct ucred *cred)
 {
        int error = 0;
-       int orig_resid;
+       size_t orig_resid;
        struct pipe *wpipe, *rpipe;
 
        rpipe = fp->f_data;
@@ -460,7 +459,7 @@ pipe_write(struct file *fp, off_t *poff,
        orig_resid = uio->uio_resid;
 
        while (uio->uio_resid) {
-               int space;
+               size_t space;
 
 retrywrite:
                if (wpipe->pipe_state & PIPE_EOF) {
@@ -476,8 +475,8 @@ retrywrite:
 
                if (space > 0) {
                        if ((error = pipelock(wpipe)) == 0) {
-                               int size;       /* Transfer size */
-                               int segsize;    /* first segment to transfer */
+                               size_t size;    /* Transfer size */
+                               size_t segsize; /* first segment to transfer */
 
                                /*
                                 * If a process blocked in uiomove, our
@@ -514,7 +513,7 @@ retrywrite:
 
                                /* Transfer first segment */
 
-                               error = 
uiomovei(&wpipe->pipe_buffer.buffer[wpipe->pipe_buffer.in], 
+                               error = 
uiomove(&wpipe->pipe_buffer.buffer[wpipe->pipe_buffer.in],
                                                segsize, uio);
 
                                if (error == 0 && segsize < size) {
@@ -529,7 +528,7 @@ retrywrite:
                                                panic("Expected pipe buffer 
wraparound disappeared");
 #endif
 
-                                       error = 
uiomovei(&wpipe->pipe_buffer.buffer[0],
+                                       error = 
uiomove(&wpipe->pipe_buffer.buffer[0],
                                                        size - segsize, uio);
                                }
                                if (error == 0) {

Martin Natano wrote:
> Below the uiomove() conversion for kern/sys_pipe.c. This diff eliminates
> a potential overflow of the nread variable.
> 
> I think it would benefit readability to sprinkle some ulmin()/MIN() into
> that code and wrap lines to <80 chars, but that's probably a matter for
> another diff. Including those changes adds to much noise to this diff.
> 
> Index: kern/sys_pipe.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/sys_pipe.c,v
> retrieving revision 1.71
> diff -u -p -u -r1.71 sys_pipe.c
> --- kern/sys_pipe.c   6 Jan 2016 17:59:30 -0000       1.71
> +++ kern/sys_pipe.c   9 Jan 2016 14:07:38 -0000
> @@ -297,8 +297,7 @@ pipe_read(struct file *fp, off_t *poff, 
>  {
>       struct pipe *rpipe = fp->f_data;
>       int error;
> -     int nread = 0;
> -     int size;
> +     size_t size, nread = 0;
>  
>       error = pipelock(rpipe);
>       if (error)
> @@ -316,7 +315,7 @@ pipe_read(struct file *fp, off_t *poff, 
>                               size = rpipe->pipe_buffer.cnt;
>                       if (size > uio->uio_resid)
>                               size = uio->uio_resid;
> -                     error = 
> uiomovei(&rpipe->pipe_buffer.buffer[rpipe->pipe_buffer.out],
> +                     error = 
> uiomove(&rpipe->pipe_buffer.buffer[rpipe->pipe_buffer.out],
>                                       size, uio);
>                       if (error) {
>                               break;
> @@ -460,7 +459,7 @@ pipe_write(struct file *fp, off_t *poff,
>       orig_resid = uio->uio_resid;
>  
>       while (uio->uio_resid) {
> -             int space;
> +             size_t space;
>  
>  retrywrite:
>               if (wpipe->pipe_state & PIPE_EOF) {
> @@ -476,8 +475,8 @@ retrywrite:
>  
>               if (space > 0) {
>                       if ((error = pipelock(wpipe)) == 0) {
> -                             int size;       /* Transfer size */
> -                             int segsize;    /* first segment to transfer */
> +                             size_t size;    /* Transfer size */
> +                             size_t segsize; /* first segment to transfer */
>  
>                               /*
>                                * If a process blocked in uiomove, our
> @@ -514,7 +513,7 @@ retrywrite:
>  
>                               /* Transfer first segment */
>  
> -                             error = 
> uiomovei(&wpipe->pipe_buffer.buffer[wpipe->pipe_buffer.in], 
> +                             error = 
> uiomove(&wpipe->pipe_buffer.buffer[wpipe->pipe_buffer.in],
>                                               segsize, uio);
>  
>                               if (error == 0 && segsize < size) {
> @@ -529,7 +528,7 @@ retrywrite:
>                                               panic("Expected pipe buffer 
> wraparound disappeared");
>  #endif
>  
> -                                     error = 
> uiomovei(&wpipe->pipe_buffer.buffer[0],
> +                                     error = 
> uiomove(&wpipe->pipe_buffer.buffer[0],
>                                                       size - segsize, uio);
>                               }
>                               if (error == 0) {
> 
> cheers,
> natano
> 

Reply via email to