summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorLibravatar Johannes Sixt <johannes.sixt@telecom.at>2007-11-30 21:36:00 +0100
committerLibravatar Johannes Sixt <johannes.sixt@telecom.at>2008-06-23 13:30:27 +0200
commit8385abfda533819be9fbec436230ccd7be4bcda8 (patch)
treebe7b242dd2be63a086930cbb428c08d56d84a8a6 /sha1_file.c
parentWindows: Treat Windows style path names. (diff)
downloadtgif-8385abfda533819be9fbec436230ccd7be4bcda8.tar.xz
Windows: Handle absolute paths in safe_create_leading_directories().
In this function we must be careful to handle drive-local paths else there is a danger that it runs into an infinite loop. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 6f004ffd09..0a54eed761 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -83,14 +83,18 @@ int get_sha1_hex(const char *hex, unsigned char *sha1)
return 0;
}
+static inline int offset_1st_component(const char *path)
+{
+ if (has_dos_drive_prefix(path))
+ return 2 + (path[2] == '/');
+ return *path == '/';
+}
+
int safe_create_leading_directories(char *path)
{
- char *pos = path;
+ char *pos = path + offset_1st_component(path);
struct stat st;
- if (is_absolute_path(path))
- pos++;
-
while (pos) {
pos = strchr(pos, '/');
if (!pos)