]> granicus.if.org Git - postgresql/commitdiff
Allow embedded spaces without quoting in unix_socket_directories entries.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Sep 2012 15:43:51 +0000 (11:43 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 6 Sep 2012 15:43:51 +0000 (11:43 -0400)
This fix removes an unnecessary incompatibility with the old behavior of
the unix_socket_directory parameter.  Since pathnames with embedded spaces
are fairly popular on some platforms, the incompatibility could be
significant in practice.  We'll still strip unquoted leading/trailing
spaces, however.

No docs update since the documentation already implied that it worked
like this.

Per bug #7514 from Murray Cumming.

src/backend/utils/adt/varlena.c

index d9e6bc4338b06dd2d2a1a48ffaaeefe32f4f294d..7e7d8c73bcf8b76f0138a3e95ac4df334a26cc09 100644 (file)
@@ -2451,9 +2451,9 @@ SplitIdentifierString(char *rawstring, char separator,
  *
  * This is similar to SplitIdentifierString, except that the parsing
  * rules are meant to handle pathnames instead of identifiers: there is
- * no downcasing, the max length is MAXPGPATH-1, and we apply
- * canonicalize_path() to each extracted string.  Because of the last,
- * the returned strings are separately palloc'd rather than being
+ * no downcasing, embedded spaces are allowed, the max length is MAXPGPATH-1,
+ * and we apply canonicalize_path() to each extracted string.  Because of the
+ * last, the returned strings are separately palloc'd rather than being
  * pointers into rawstring --- but we still scribble on rawstring.
  *
  * Inputs:
@@ -2510,13 +2510,16 @@ SplitDirectoriesString(char *rawstring, char separator,
                }
                else
                {
-                       /* Unquoted name --- extends to separator or whitespace */
-                       curname = nextp;
-                       while (*nextp && *nextp != separator &&
-                                  !isspace((unsigned char) *nextp))
+                       /* Unquoted name --- extends to separator or end of string */
+                       curname = endp = nextp;
+                       while (*nextp && *nextp != separator)
+                       {
+                               /* trailing whitespace should not be included in name */
+                               if (!isspace((unsigned char) *nextp))
+                                       endp = nextp + 1;
                                nextp++;
-                       endp = nextp;
-                       if (curname == nextp)
+                       }
+                       if (curname == endp)
                                return false;   /* empty unquoted name not allowed */
                }