Allow embedded spaces without quoting in unix_socket_directories entries.
authorTom Lane
Thu, 6 Sep 2012 15:43:51 +0000 (11:43 -0400)
committerTom Lane
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 */
        }