summaryrefslogtreecommitdiff
path: root/src/xz
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2010-12-12 14:50:04 +0200
committerLasse Collin <lasse.collin@tukaani.org>2010-12-12 14:50:04 +0200
commite6baedddcf54e7da049ebc49183565b99facd4c7 (patch)
treebc73e79428a1cab7228782413dec76296673015a /src/xz
parentb7afd3e22a8fac115b75c738d40d3eb1de7e286f (diff)
downloadxz-e6baedddcf54e7da049ebc49183565b99facd4c7.tar.gz
DOS-like: Treat \ and : as directory separators in addition to /.
Juan Manuel Guerrero had fixed this in his XZ Utils port to DOS/DJGPP. The bug affects also Windows and OS/2.
Diffstat (limited to 'src/xz')
-rw-r--r--src/xz/suffix.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/xz/suffix.c b/src/xz/suffix.c
index f2a2da2..ea86c1a 100644
--- a/src/xz/suffix.c
+++ b/src/xz/suffix.c
@@ -27,6 +27,30 @@ struct suffix_pair {
};
+/// \brief Test if the char is a directory separator
+static bool
+is_dir_sep(char c)
+{
+#ifdef TUKLIB_DOSLIKE
+ return c == '/' || c == '\\' || c == ':';
+#else
+ return c == '/';
+#endif
+}
+
+
+/// \brief Test if the string contains a directory separator
+static bool
+has_dir_sep(const char *str)
+{
+#ifdef TUKLIB_DOSLIKE
+ return strpbrk(str, "/\\:") != NULL;
+#else
+ return strchr(str, '/') != NULL;
+#endif
+}
+
+
/// \brief Checks if src_name has given compressed_suffix
///
/// \param suffix Filename suffix to look for
@@ -44,7 +68,8 @@ test_suffix(const char *suffix, const char *src_name, size_t src_len)
// The filename must have at least one character in addition to
// the suffix. src_name may contain path to the filename, so we
// need to check for directory separator too.
- if (src_len <= suffix_len || src_name[src_len - suffix_len - 1] == '/')
+ if (src_len <= suffix_len
+ || is_dir_sep(src_name[src_len - suffix_len - 1]))
return 0;
if (strcmp(suffix, src_name + src_len - suffix_len) == 0)
@@ -199,9 +224,9 @@ suffix_get_dest_name(const char *src_name)
extern void
suffix_set(const char *suffix)
{
- // Empty suffix and suffixes having a slash are rejected. Such
- // suffixes would break things later.
- if (suffix[0] == '\0' || strchr(suffix, '/') != NULL)
+ // Empty suffix and suffixes having a directory separator are
+ // rejected. Such suffixes would break things later.
+ if (suffix[0] == '\0' || has_dir_sep(suffix))
message_fatal(_("%s: Invalid filename suffix"), optarg);
// Replace the old custom_suffix (if any) with the new suffix.