diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2005-10-28 22:17:00 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2005-10-28 22:17:00 +0000 |
commit | 50a6da201bd874a20c2adc214c6016e3eab29d06 (patch) | |
tree | 0ddafda8e667b86ae615343fd93e72a2397d2f52 | |
parent | f6d480b0a7006e57e6e6989f4caba6aa13a363b8 (diff) | |
download | coreutils-50a6da201bd874a20c2adc214c6016e3eab29d06.tar.xz |
(FILE_BASENAME_CONCAT): Omit unnecessary slashes in the
boundary between DEST and SOURCE in the result.
-rw-r--r-- | src/ln.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -54,7 +54,10 @@ #endif /* Construct a string NEW_DEST by concatenating DEST, a slash, and - basename(SOURCE) in alloca'd memory. Don't modify DEST or SOURCE. */ + basename (SOURCE) in alloca'd memory. Don't modify DEST or SOURCE. + Omit unnecessary slashes in the boundary between DEST and SOURCE in + the result; they can cause harm if "/" and "//" denote different + directories. */ #define FILE_BASENAME_CONCAT(new_dest, dest, source) \ do \ @@ -62,15 +65,18 @@ const char *source_base; \ char *tmp_source; \ size_t buf_len = strlen (source) + 1; \ + size_t dest_len = strlen (dest); \ \ tmp_source = alloca (buf_len); \ memcpy (tmp_source, (source), buf_len); \ strip_trailing_slashes (tmp_source); \ source_base = base_name (tmp_source); \ - \ - (new_dest) = alloca (strlen ((dest)) + 1 \ - + strlen (source_base) + 1); \ - stpcpy (stpcpy (stpcpy ((new_dest), (dest)), "/"), source_base);\ + source_base += (source_base[0] == '/'); \ + dest_len -= (dest_len != 0 && (dest)[dest_len - 1] == '/'); \ + (new_dest) = alloca (dest_len + 1 + strlen (source_base) + 1); \ + memcpy (new_dest, dest, dest_len); \ + (new_dest)[dest_len] = '/'; \ + strcpy ((new_dest) + dest_len + 1, source_base); \ } \ while (0) |