summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane1998-11-29 01:48:42 +0000
committerTom Lane1998-11-29 01:48:42 +0000
commit932dbd1c30d5cba05fe45673873e66c549e91636 (patch)
treeca0370136c6ff60477acd51a90e9cee2746eeb24
parentf2b8bfb4083ee669c1b4eefb6dba9a45743f8376 (diff)
pq_getstr didn't handle buffer overrun correctly; it would
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.
-rw-r--r--src/backend/libpq/pqcomm.c39
1 files changed, 13 insertions, 26 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 04ebddb5e69..1d724f16979 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -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.57.2.1 1998/11/29 01:48: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;
}
/*