Author: trasz
Date: Thu May 21 13:39:38 2015
New Revision: 283240
URL: https://svnweb.freebsd.org/changeset/base/283240

Log:
  MFC r279953:
  
  Rework the concat() algorithm to be correct in all cases.
  
  Sponsored by: The FreeBSD Foundation

Modified:
  stable/10/usr.sbin/autofs/common.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/autofs/common.c
==============================================================================
--- stable/10/usr.sbin/autofs/common.c  Thu May 21 13:37:48 2015        
(r283239)
+++ stable/10/usr.sbin/autofs/common.c  Thu May 21 13:39:38 2015        
(r283240)
@@ -92,6 +92,7 @@ char *
 concat(const char *s1, char separator, const char *s2)
 {
        char *result;
+       char s1last, s2first;
        int ret;
 
        if (s1 == NULL)
@@ -99,14 +100,22 @@ concat(const char *s1, char separator, c
        if (s2 == NULL)
                s2 = "";
 
-       /*
-        * If s2 starts with separator - skip it; otherwise concatenating
-        * "/" and "/foo" would end up returning "//foo".
-        */
-       if (s2[0] == separator)
-               s2++;
+       if (s1[0] == '\0')
+               s1last = '\0';
+       else
+               s1last = s1[strlen(s1) - 1];
 
-       if (s1[0] == '\0' || s2[0] == '\0' || s1[strlen(s1) - 1] == separator) {
+       s2first = s2[0];
+
+       if (s1last == separator && s2first == separator) {
+               /*
+                * If s1 ends with the separator and s2 begins with
+                * it - skip the latter; otherwise concatenating "/"
+                * and "/foo" would end up returning "//foo".
+                */
+               ret = asprintf(&result, "%s%s", s1, s2 + 1);
+       } else if (s1last == separator || s2first == separator ||
+           s1[0] == '\0' || s2[0] == '\0') {
                ret = asprintf(&result, "%s%s", s1, s2);
        } else {
                ret = asprintf(&result, "%s%c%s", s1, separator, s2);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to