]> granicus.if.org Git - postgresql/commitdiff
Cause PQescapeString to stop processing at a null character, rather
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Oct 2003 18:26:14 +0000 (18:26 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 3 Oct 2003 18:26:14 +0000 (18:26 +0000)
than generating an invalid output string.  Per observation and patch
from Igor Shevchenko.  Further code cleanup and documentation by
Tom Lane.

doc/src/sgml/libpq.sgml
src/interfaces/libpq/fe-exec.c

index cd2a8f491ff3a6734512fd150ea5ea47059f8d15..37e1fffb5fe85f3ccdb7418b8ea02e88279c4e4b 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.137 2003/09/20 20:12:05 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.138 2003/10/03 18:26:14 tgl Exp $
 -->
 
  <chapter id="libpq">
@@ -1972,10 +1972,13 @@ size_t PQescapeString (char *to, const char *from, size_t length);
 
 <para>
 The parameter <parameter>from</> points to the first character of the string
-that 
-is to be escaped, and the <parameter>length</> parameter gives the
-number of characters in this string.  (A terminating zero byte is
-neither necessary nor counted.)  <parameter>to</> shall point to a
+that is to be escaped, and the <parameter>length</> parameter gives the
+number of characters in this string.  A terminating zero byte is not
+required, and should not be counted in <parameter>length</>.  (If
+a terminating zero byte is found before <parameter>length</> bytes are
+processed, <function>PQescapeString</> stops at the zero; the behavior
+is thus rather like <function>strncpy</>.)
+<parameter>to</> shall point to a
 buffer that is able to hold at least one more character than twice
 the value of <parameter>length</>, otherwise the behavior is
 undefined.  A call to <function>PQescapeString</> writes an escaped
index 6f23fde1e406a3c95d6e6962fe1bc22d740d5d0f..6d159a9a35a5569a770525edddf4f312b59d7a86 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.149 2003/10/02 14:47:44 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.150 2003/10/03 18:26:14 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2143,47 +2143,47 @@ PQfreeNotify(PGnotify *notify)
 }
 
 
-/* ---------------
- * Escaping arbitrary strings to get valid SQL strings/identifiers.
+/*
+ * Escaping arbitrary strings to get valid SQL literal strings.
  *
  * Replaces "\\" with "\\\\" and "'" with "''".
- * length is the length of the buffer pointed to by
- * from.  The buffer at to must be at least 2*length + 1 characters
- * long.  A terminating NUL character is written.
- * ---------------
+ *
+ * length is the length of the source string.  (Note: if a terminating NUL
+ * is encountered sooner, PQescapeString stops short of "length"; the behavior
+ * is thus rather like strncpy.)
+ *
+ * For safety the buffer at "to" must be at least 2*length + 1 bytes long.
+ * A terminating NUL character is added to the output string, whether the
+ * input is NUL-terminated or not.
+ *
+ * Returns the actual length of the output (not counting the terminating NUL).
  */
-
 size_t
 PQescapeString(char *to, const char *from, size_t length)
 {
        const char *source = from;
        char       *target = to;
-       unsigned int remaining = length;
+       size_t          remaining = length;
 
-       while (remaining > 0)
+       while (remaining > 0 && *source != '\0')
        {
                switch (*source)
                {
                        case '\\':
-                               *target = '\\';
-                               target++;
-                               *target = '\\';
-                               /* target and remaining are updated below. */
+                               *target++ = '\\';
+                               *target++ = '\\';
                                break;
 
                        case '\'':
-                               *target = '\'';
-                               target++;
-                               *target = '\'';
-                               /* target and remaining are updated below. */
+                               *target++ = '\'';
+                               *target++ = '\'';
                                break;
 
                        default:
-                               *target = *source;
-                               /* target and remaining are updated below. */
+                               *target++ = *source;
+                               break;
                }
                source++;
-               target++;
                remaining--;
        }