]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pq_getstr didn't handle buffer overrun correctly; it would
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Nov 1998 01:47:42 +0000 (01:47 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Nov 1998 01:47:42 +0000 (01:47 +0000)
fail to consume the rest of the input string, and worse it would write
one more byte than it should into the buffer, probably resulting in coredump.
Fortunately there's a correct implementation next door in pqcomprim.c.

src/backend/libpq/pqcomm.c

index 04ebddb5e69250ca419df6879bc57ee063b07d45..623e8a1d10cedafb56ecd0358fcda274d3f6c221 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.57 1998/10/13 20:44:40 scrappy Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.58 1998/11/29 01:47:42 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -108,6 +108,9 @@ pq_init(int fd)
  *
  *      used for debugging libpq
  */
+
+#if 0                                                  /* not used anymore */
+
 static int
 pq_getc(FILE *fin)
 {
@@ -119,6 +122,8 @@ pq_getc(FILE *fin)
        return c;
 }
 
+#endif
+
 /* --------------------------------
  *             pq_gettty - return the name of the tty in the given buffer
  * --------------------------------
@@ -181,15 +186,9 @@ pq_flush()
 int
 pq_getstr(char *s, int maxlen)
 {
-       int                     c = '\0';
-
+       int                     c;
 #ifdef MULTIBYTE
-       unsigned char *p,
-                          *ps;
-       int                     len;
-
-       ps = s;
-       len = maxlen;
+       char       *p;
 #endif
 
        if (Pfin == (FILE *) NULL)
@@ -198,27 +197,15 @@ pq_getstr(char *s, int maxlen)
                return EOF;
        }
 
-       while (maxlen-- && (c = pq_getc(Pfin)) != EOF && c)
-               *s++ = c;
-       *s = '\0';
+       c = pqGetString(s, maxlen, Pfin);
 
 #ifdef MULTIBYTE
-       p = pg_client_to_server(ps, len);
-       if (ps != p)
-       {                                                       /* actual conversion has been done? */
-               strcpy(ps, p);
-       }
+       p = (char*) pg_client_to_server((unsigned char *) s, maxlen);
+       if (s != p)                                     /* actual conversion has been done? */
+               strcpy(s, p);
 #endif
 
-       /* -----------------
-        *         If EOF reached let caller know.
-        *         (This will only happen if we hit EOF before the string
-        *         delimiter is reached.)
-        * -----------------
-        */
-       if (c == EOF)
-               return EOF;
-       return !EOF;
+       return c;
 }
 
 /*