aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2015-03-13 11:26:02 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2015-03-13 11:26:02 +0000
commitcd3772d07611d360a12a9ce663b096ec76a593e9 (patch)
treeabfa0fab813cc3618efd638ba70d1d8ce4a65b8d /usr.sbin
parent8f73e775366f753df3aae04aec34633ee0ca74d8 (diff)
downloadsrc-cd3772d07611d360a12a9ce663b096ec76a593e9.tar.gz
src-cd3772d07611d360a12a9ce663b096ec76a593e9.zip
Rework the concat() algorithm to be correct in all cases.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=279953
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/autofs/common.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/usr.sbin/autofs/common.c b/usr.sbin/autofs/common.c
index 4df177c17e9f..eae118fae621 100644
--- a/usr.sbin/autofs/common.c
+++ b/usr.sbin/autofs/common.c
@@ -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, const char *s2)
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);