Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
77c3999c
Commit
77c3999c
authored
May 14, 2011
by
nulltoken
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move fileops.c to the new error handling
parent
f02f4b53
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
36 additions
and
25 deletions
+36
-25
src/fileops.c
+36
-25
No files found.
src/fileops.c
View file @
77c3999c
...
@@ -10,7 +10,7 @@ int gitfo_mkdir_2file(const char *file_path)
...
@@ -10,7 +10,7 @@ int gitfo_mkdir_2file(const char *file_path)
error
=
git__dirname_r
(
target_folder_path
,
sizeof
(
target_folder_path
),
file_path
);
error
=
git__dirname_r
(
target_folder_path
,
sizeof
(
target_folder_path
),
file_path
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
GIT_SUCCESS
)
return
error
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to recursively build `%s` tree structure. Unable to parse parent folder name"
,
file_path
)
;
/* Does the containing folder exist? */
/* Does the containing folder exist? */
if
(
gitfo_isdir
(
target_folder_path
))
{
if
(
gitfo_isdir
(
target_folder_path
))
{
...
@@ -19,7 +19,7 @@ int gitfo_mkdir_2file(const char *file_path)
...
@@ -19,7 +19,7 @@ int gitfo_mkdir_2file(const char *file_path)
/* Let's create the tree structure */
/* Let's create the tree structure */
error
=
gitfo_mkdir_recurs
(
target_folder_path
,
mode
);
error
=
gitfo_mkdir_recurs
(
target_folder_path
,
mode
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
GIT_SUCCESS
)
return
error
;
return
error
;
/* The callee already takes care of setting the correct error message. */
}
}
return
GIT_SUCCESS
;
return
GIT_SUCCESS
;
...
@@ -164,19 +164,19 @@ int gitfo_read_file(gitfo_buf *obj, const char *path)
...
@@ -164,19 +164,19 @@ int gitfo_read_file(gitfo_buf *obj, const char *path)
if
(((
size
=
gitfo_size
(
fd
))
<
0
)
||
!
git__is_sizet
(
size
+
1
))
{
if
(((
size
=
gitfo_size
(
fd
))
<
0
)
||
!
git__is_sizet
(
size
+
1
))
{
gitfo_close
(
fd
);
gitfo_close
(
fd
);
return
GIT_ERROR
;
return
git__throw
(
GIT_ERROR
,
"Failed to read file `%s`. Either an error occured while calculating its size or the file is too large"
,
path
)
;
}
}
len
=
(
size_t
)
size
;
len
=
(
size_t
)
size
;
if
((
buff
=
git__malloc
(
len
+
1
))
==
NULL
)
{
if
((
buff
=
git__malloc
(
len
+
1
))
==
NULL
)
{
gitfo_close
(
fd
);
gitfo_close
(
fd
);
return
GIT_E
RROR
;
return
GIT_E
NOMEM
;
}
}
if
(
gitfo_read
(
fd
,
buff
,
len
)
<
0
)
{
if
(
gitfo_read
(
fd
,
buff
,
len
)
<
0
)
{
gitfo_close
(
fd
);
gitfo_close
(
fd
);
free
(
buff
);
free
(
buff
);
return
GIT_ERROR
;
return
git__throw
(
GIT_ERROR
,
"Failed to read file `%s`"
,
path
)
;
}
}
buff
[
len
]
=
'\0'
;
buff
[
len
]
=
'\0'
;
...
@@ -197,13 +197,15 @@ void gitfo_free_buf(gitfo_buf *obj)
...
@@ -197,13 +197,15 @@ void gitfo_free_buf(gitfo_buf *obj)
int
gitfo_mv
(
const
char
*
from
,
const
char
*
to
)
int
gitfo_mv
(
const
char
*
from
,
const
char
*
to
)
{
{
int
error
;
#ifdef GIT_WIN32
#ifdef GIT_WIN32
/*
/*
* Win32 POSIX compilance my ass. If the destination
* Win32 POSIX compilance my ass. If the destination
* file exists, the `rename` call fails. This is as
* file exists, the `rename` call fails. This is as
* close as it gets with the Win32 API.
* close as it gets with the Win32 API.
*/
*/
return
MoveFileEx
(
from
,
to
,
MOVEFILE_REPLACE_EXISTING
|
MOVEFILE_COPY_ALLOWED
)
?
GIT_SUCCESS
:
GIT_EOSERR
;
error
=
MoveFileEx
(
from
,
to
,
MOVEFILE_REPLACE_EXISTING
|
MOVEFILE_COPY_ALLOWED
)
?
GIT_SUCCESS
:
GIT_EOSERR
;
#else
#else
/* Don't even try this on Win32 */
/* Don't even try this on Win32 */
if
(
!
link
(
from
,
to
))
{
if
(
!
link
(
from
,
to
))
{
...
@@ -214,16 +216,21 @@ int gitfo_mv(const char *from, const char *to)
...
@@ -214,16 +216,21 @@ int gitfo_mv(const char *from, const char *to)
if
(
!
rename
(
from
,
to
))
if
(
!
rename
(
from
,
to
))
return
GIT_SUCCESS
;
return
GIT_SUCCESS
;
return
GIT_EOSERR
;
error
=
GIT_EOSERR
;
#endif
#endif
if
(
error
<
GIT_SUCCESS
)
return
git__throw
(
error
,
"Failed to move file from `%s`to `%s`"
,
from
,
to
);
return
GIT_SUCCESS
;
}
}
int
gitfo_mv_force
(
const
char
*
from
,
const
char
*
to
)
int
gitfo_mv_force
(
const
char
*
from
,
const
char
*
to
)
{
{
if
(
gitfo_mkdir_2file
(
to
)
<
GIT_SUCCESS
)
if
(
gitfo_mkdir_2file
(
to
)
<
GIT_SUCCESS
)
return
GIT_EOSERR
;
return
GIT_EOSERR
;
/* The callee already takes care of setting the correct error message. */
return
gitfo_mv
(
from
,
to
);
return
gitfo_mv
(
from
,
to
);
/* The callee already takes care of setting the correct error message. */
}
}
int
gitfo_map_ro
(
git_map
*
out
,
git_file
fd
,
git_off_t
begin
,
size_t
len
)
int
gitfo_map_ro
(
git_map
*
out
,
git_file
fd
,
git_off_t
begin
,
size_t
len
)
...
@@ -338,7 +345,7 @@ int gitfo_dirent(
...
@@ -338,7 +345,7 @@ int gitfo_dirent(
struct
dirent
*
de
;
struct
dirent
*
de
;
if
(
!
wd_len
||
path_sz
<
wd_len
+
2
)
if
(
!
wd_len
||
path_sz
<
wd_len
+
2
)
return
GIT_ERROR
;
return
git__throw
(
GIT_EINVALIDARGS
,
"Failed to process `%s` tree structure. Path is either empty or buffer size is too short"
,
path
)
;
while
(
path
[
wd_len
-
1
]
==
'/'
)
while
(
path
[
wd_len
-
1
]
==
'/'
)
wd_len
--
;
wd_len
--
;
...
@@ -347,7 +354,7 @@ int gitfo_dirent(
...
@@ -347,7 +354,7 @@ int gitfo_dirent(
dir
=
opendir
(
path
);
dir
=
opendir
(
path
);
if
(
!
dir
)
if
(
!
dir
)
return
GIT_EOSERR
;
return
git__throw
(
GIT_EOSERR
,
"Failed to process `%s` tree structure. An error occured while opening the directory"
,
path
)
;
while
((
de
=
readdir
(
dir
))
!=
NULL
)
{
while
((
de
=
readdir
(
dir
))
!=
NULL
)
{
size_t
de_len
;
size_t
de_len
;
...
@@ -364,14 +371,14 @@ int gitfo_dirent(
...
@@ -364,14 +371,14 @@ int gitfo_dirent(
de_len
=
strlen
(
de
->
d_name
);
de_len
=
strlen
(
de
->
d_name
);
if
(
path_sz
<
wd_len
+
de_len
+
1
)
{
if
(
path_sz
<
wd_len
+
de_len
+
1
)
{
closedir
(
dir
);
closedir
(
dir
);
return
GIT_ERROR
;
return
git__throw
(
GIT_ERROR
,
"Failed to process `%s` tree structure. Buffer size is too short"
,
path
)
;
}
}
strcpy
(
path
+
wd_len
,
de
->
d_name
);
strcpy
(
path
+
wd_len
,
de
->
d_name
);
result
=
fn
(
arg
,
path
);
result
=
fn
(
arg
,
path
);
if
(
result
<
GIT_SUCCESS
)
{
if
(
result
<
GIT_SUCCESS
)
{
closedir
(
dir
);
closedir
(
dir
);
return
result
;
return
result
;
/* The callee is reponsible for setting the correct error message */
}
}
if
(
result
>
0
)
{
if
(
result
>
0
)
{
closedir
(
dir
);
closedir
(
dir
);
...
@@ -399,7 +406,7 @@ int retrieve_path_root_offset(const char *path)
...
@@ -399,7 +406,7 @@ int retrieve_path_root_offset(const char *path)
if
(
*
(
path
+
offset
)
==
'/'
)
if
(
*
(
path
+
offset
)
==
'/'
)
return
offset
;
return
offset
;
return
GIT_ERROR
;
return
-
1
;
/* Not a real error. Rather a signal than the path is not rooted */
}
}
...
@@ -438,7 +445,11 @@ int gitfo_mkdir_recurs(const char *path, int mode)
...
@@ -438,7 +445,11 @@ int gitfo_mkdir_recurs(const char *path, int mode)
error
=
gitfo_mkdir
(
path
,
mode
);
error
=
gitfo_mkdir
(
path
,
mode
);
free
(
path_copy
);
free
(
path_copy
);
return
error
;
if
(
error
<
GIT_SUCCESS
)
return
git__throw
(
error
,
"Failed to recursively create `%s` tree structure"
,
path
);
return
GIT_SUCCESS
;
}
}
static
int
retrieve_previous_path_component_start
(
const
char
*
path
)
static
int
retrieve_previous_path_component_start
(
const
char
*
path
)
...
@@ -484,7 +495,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
...
@@ -484,7 +495,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
if
(
root_path_offset
<
0
)
{
if
(
root_path_offset
<
0
)
{
error
=
gitfo_getcwd
(
buffer_out
,
size
);
error
=
gitfo_getcwd
(
buffer_out
,
size
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
GIT_SUCCESS
)
return
error
;
return
error
;
/* The callee already takes care of setting the correct error message. */
len
=
strlen
(
buffer_out
);
len
=
strlen
(
buffer_out
);
buffer_out
+=
len
;
buffer_out
+=
len
;
...
@@ -529,7 +540,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
...
@@ -529,7 +540,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
/* Are we escaping out of the root dir? */
/* Are we escaping out of the root dir? */
if
(
len
<
0
)
if
(
len
<
0
)
return
GIT_EINVALIDPATH
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to normalize path `%s`. The path escapes out of the root directory"
,
path
)
;
buffer_out
=
(
char
*
)
buffer_out_start
+
len
;
buffer_out
=
(
char
*
)
buffer_out_start
+
len
;
continue
;
continue
;
...
@@ -537,7 +548,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
...
@@ -537,7 +548,7 @@ int gitfo_prettify_dir_path(char *buffer_out, size_t size, const char *path)
/* Guard against potential multiple dot path traversal (cf http://cwe.mitre.org/data/definitions/33.html) */
/* Guard against potential multiple dot path traversal (cf http://cwe.mitre.org/data/definitions/33.html) */
if
(
only_dots
&&
segment_len
>
0
)
if
(
only_dots
&&
segment_len
>
0
)
return
GIT_EINVALIDPATH
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to normalize path `%s`. The path contains a segment with three `.` or more"
,
path
)
;
*
buffer_out
++
=
'/'
;
*
buffer_out
++
=
'/'
;
len
++
;
len
++
;
...
@@ -557,21 +568,21 @@ int gitfo_prettify_file_path(char *buffer_out, size_t size, const char *path)
...
@@ -557,21 +568,21 @@ int gitfo_prettify_file_path(char *buffer_out, size_t size, const char *path)
/* Let's make sure the filename isn't empty nor a dot */
/* Let's make sure the filename isn't empty nor a dot */
if
(
path_len
==
0
||
(
path_len
==
1
&&
*
path
==
'.'
))
if
(
path_len
==
0
||
(
path_len
==
1
&&
*
path
==
'.'
))
return
GIT_EINVALIDPATH
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to normalize file path `%s`. The path is either empty or equals `.`"
,
path
)
;
/* Let's make sure the filename doesn't end with "/", "/." or "/.." */
/* Let's make sure the filename doesn't end with "/", "/." or "/.." */
for
(
i
=
1
;
path_len
>
i
&&
i
<
4
;
i
++
)
{
for
(
i
=
1
;
path_len
>
i
&&
i
<
4
;
i
++
)
{
if
(
!
strncmp
(
path
+
path_len
-
i
,
pattern
,
i
))
if
(
!
strncmp
(
path
+
path_len
-
i
,
pattern
,
i
))
return
GIT_EINVALIDPATH
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to normalize file path `%s`. The path points to a folder"
,
path
)
;
}
}
error
=
gitfo_prettify_dir_path
(
buffer_out
,
size
,
path
);
error
=
gitfo_prettify_dir_path
(
buffer_out
,
size
,
path
);
if
(
error
<
GIT_SUCCESS
)
if
(
error
<
GIT_SUCCESS
)
return
error
;
return
error
;
/* The callee already takes care of setting the correct error message. */
path_len
=
strlen
(
buffer_out
);
path_len
=
strlen
(
buffer_out
);
if
(
path_len
<
2
)
if
(
path_len
<
2
)
/* TODO: Fixme. We should also take of detecting Windows rooted path (probably through usage of retrieve_path_root_offset) */
return
GIT_EINVALIDPATH
;
return
git__throw
(
GIT_EINVALIDPATH
,
"Failed to normalize file path `%s`. The path points to a folder"
,
path
)
;
/* Remove the trailing slash */
/* Remove the trailing slash */
buffer_out
[
path_len
-
1
]
=
'\0'
;
buffer_out
[
path_len
-
1
]
=
'\0'
;
...
@@ -616,11 +627,11 @@ int gitfo_getcwd(char *buffer_out, size_t size)
...
@@ -616,11 +627,11 @@ int gitfo_getcwd(char *buffer_out, size_t size)
#ifdef GIT_WIN32
#ifdef GIT_WIN32
cwd_buffer
=
_getcwd
(
buffer_out
,
size
);
cwd_buffer
=
_getcwd
(
buffer_out
,
size
);
#else
#else
cwd_buffer
=
getcwd
(
buffer_out
,
size
);
//TODO: Fixme. Ensure the required headers are correctly included
cwd_buffer
=
getcwd
(
buffer_out
,
size
);
#endif
#endif
if
(
cwd_buffer
==
NULL
)
if
(
cwd_buffer
==
NULL
)
return
GIT_EOSERR
;
return
git__throw
(
GIT_EOSERR
,
"Failed to retrieve current working directory"
)
;
posixify_path
(
buffer_out
);
posixify_path
(
buffer_out
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment