mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-11-23 09:51:11 +01:00
Rework the concat() algorithm to be correct in all cases.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
This commit is contained in:
parent
8f73e77536
commit
cd3772d076
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279953
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user