Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src (getdelim.c:1.1)



On Monday 2009-07-13 22:19 +0000, Roy Marples output:
:Module Name:   src
:Committed By:  roy
:Date:          Mon Jul 13 22:19:25 UTC 2009
:
:Modified Files:
:       src/distrib/sets/lists/comp: mi
:       src/include: stdio.h
:       src/lib/libc/stdio: Makefile.inc stdio.3
:Added Files:
:       src/lib/libc/stdio: getdelim.3 getdelim.c getline.c
:
:Log Message:
:Add implementations for getdelim(3) and getline(3).
[...]
:cvs rdiff -u -r0 -r1.1 src/lib/libc/stdio/getdelim.3 \
:    src/lib/libc/stdio/getdelim.c src/lib/libc/stdio/getline.c

arg #3 of memchr() is size_t.

I don't know how "Ensure that the resultant buffer length fits in ssize_t"
is supposed to work.  You're promoting SSIZE_MAX from ssize_t to ssize_t,
then comparing with an already possibly overflowed variable "newlen". 
Also I didn't really look through the code so I don't know why you added
an extra one there in the comparison.

Maybe you want something like the following.

Regards,
Geoff

Index: lib/libc/stdio/getdelim.c
===================================================================
RCS file: /cvsroot/src/lib/libc/stdio/getdelim.c,v
retrieving revision 1.1
diff -u -r1.1 getdelim.c
--- lib/libc/stdio/getdelim.c   13 Jul 2009 22:19:25 -0000      1.1
+++ lib/libc/stdio/getdelim.c   14 Jul 2009 01:13:02 -0000
@@ -79,18 +79,18 @@
                }
 
                /* Scan through looking for the separator */
-               p = memchr(fp->_p, sep, fp->_r);
+               p = memchr(fp->_p, sep, (size_t)fp->_r);
                if (p == NULL)
                        len = fp->_r;
                else
                        len = (p - fp->_p) + 1;
 
-               newlen = off + len + 1;
                /* Ensure that the resultant buffer length fits in ssize_t */
-               if (newlen > (size_t)SSIZE_MAX + 1) {
+               if (off + len + 1 > (unsigned int)SSIZE_MAX) {
                        errno = EOVERFLOW;
                        goto error;
                }
+               newlen = off + len + 1;
                if (newlen > *buflen) {
                        if (newlen < MINBUF)
                                newlen = MINBUF;


Home | Main Index | Thread Index | Old Index