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
af567e88
Commit
af567e88
authored
May 12, 2014
by
Russell Belfer
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2334 from libgit2/rb/fix-2333
Be more careful with user-supplied buffers
parents
ce3b71d9
1e4976cb
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
46 additions
and
23 deletions
+46
-23
src/buffer.c
+22
-15
src/config.c
+3
-0
src/diff_print.c
+3
-3
src/filter.c
+4
-1
src/pack-objects.c
+1
-0
src/submodule.c
+3
-1
tests/object/blob/filter.c
+10
-3
No files found.
src/buffer.c
View file @
af567e88
...
...
@@ -104,17 +104,20 @@ void git_buf_free(git_buf *buf)
void
git_buf_sanitize
(
git_buf
*
buf
)
{
if
(
buf
->
ptr
==
NULL
)
{
assert
(
buf
->
size
==
0
&&
buf
->
asize
==
0
);
assert
(
buf
->
size
==
0
&&
buf
->
asize
==
0
);
buf
->
ptr
=
git_buf__initbuf
;
}
}
else
if
(
buf
->
asize
>
buf
->
size
)
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
}
void
git_buf_clear
(
git_buf
*
buf
)
{
buf
->
size
=
0
;
if
(
!
buf
->
ptr
)
if
(
!
buf
->
ptr
)
{
buf
->
ptr
=
git_buf__initbuf
;
buf
->
asize
=
0
;
}
if
(
buf
->
asize
>
0
)
buf
->
ptr
[
0
]
=
'\0'
;
...
...
@@ -129,8 +132,11 @@ int git_buf_set(git_buf *buf, const void *data, size_t len)
ENSURE_SIZE
(
buf
,
len
+
1
);
memmove
(
buf
->
ptr
,
data
,
len
);
}
buf
->
size
=
len
;
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
if
(
buf
->
asize
>
buf
->
size
)
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
}
return
0
;
}
...
...
@@ -326,19 +332,20 @@ void git_buf_consume(git_buf *buf, const char *end)
void
git_buf_truncate
(
git_buf
*
buf
,
size_t
len
)
{
if
(
len
<
buf
->
size
)
{
buf
->
size
=
len
;
if
(
len
>=
buf
->
size
)
return
;
buf
->
size
=
len
;
if
(
buf
->
size
<
buf
->
asize
)
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
}
}
void
git_buf_shorten
(
git_buf
*
buf
,
size_t
amount
)
{
if
(
amount
>
buf
->
size
)
amount
=
buf
->
size
;
buf
->
size
=
buf
->
size
-
amount
;
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
if
(
buf
->
size
>
amount
)
git_buf_truncate
(
buf
,
buf
->
size
-
amount
);
else
git_buf_clear
(
buf
);
}
void
git_buf_rtruncate_at_char
(
git_buf
*
buf
,
char
separator
)
...
...
@@ -574,7 +581,8 @@ void git_buf_rtrim(git_buf *buf)
buf
->
size
--
;
}
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
if
(
buf
->
asize
>
buf
->
size
)
buf
->
ptr
[
buf
->
size
]
=
'\0'
;
}
int
git_buf_cmp
(
const
git_buf
*
a
,
const
git_buf
*
b
)
...
...
@@ -598,8 +606,7 @@ int git_buf_splice(
/* Ported from git.git
* https://github.com/git/git/blob/16eed7c/strbuf.c#L159-176
*/
if
(
git_buf_grow
(
buf
,
git_buf_len
(
buf
)
+
nb_to_insert
-
nb_to_remove
)
<
0
)
return
-
1
;
ENSURE_SIZE
(
buf
,
buf
->
size
+
nb_to_insert
-
nb_to_insert
+
1
);
memmove
(
buf
->
ptr
+
where
+
nb_to_insert
,
buf
->
ptr
+
where
+
nb_to_remove
,
...
...
src/config.c
View file @
af567e88
...
...
@@ -999,16 +999,19 @@ void git_config_iterator_free(git_config_iterator *iter)
int
git_config_find_global
(
git_buf
*
path
)
{
git_buf_sanitize
(
path
);
return
git_sysdir_find_global_file
(
path
,
GIT_CONFIG_FILENAME_GLOBAL
);
}
int
git_config_find_xdg
(
git_buf
*
path
)
{
git_buf_sanitize
(
path
);
return
git_sysdir_find_xdg_file
(
path
,
GIT_CONFIG_FILENAME_XDG
);
}
int
git_config_find_system
(
git_buf
*
path
)
{
git_buf_sanitize
(
path
);
return
git_sysdir_find_system_file
(
path
,
GIT_CONFIG_FILENAME_SYSTEM
);
}
...
...
src/diff_print.c
View file @
af567e88
...
...
@@ -597,9 +597,9 @@ int git_diff_print_callback__to_file_handle(
}
/* print a git_patch to a git_buf */
int
git_patch_to_buf
(
git_buf
*
out
,
git_patch
*
patch
)
int
git_patch_to_buf
(
git_buf
*
out
,
git_patch
*
patch
)
{
assert
(
out
&&
patch
);
git_buf_sanitize
(
out
);
return
git_patch_print
(
patch
,
git_diff_print_callback__to_buf
,
out
);
}
src/filter.c
View file @
af567e88
...
...
@@ -591,6 +591,9 @@ int git_filter_list_apply_to_data(
git_buf
*
dbuffer
[
2
],
local
=
GIT_BUF_INIT
;
unsigned
int
si
=
0
;
git_buf_sanitize
(
tgt
);
git_buf_sanitize
(
src
);
if
(
!
fl
)
return
filter_list_out_buffer_from_raw
(
tgt
,
src
->
ptr
,
src
->
size
);
...
...
@@ -626,7 +629,7 @@ int git_filter_list_apply_to_data(
/* PASSTHROUGH means filter decided not to process the buffer */
error
=
0
;
}
else
if
(
!
error
)
{
git_buf_s
horten
(
dbuffer
[
di
],
0
);
/* force NUL termination */
git_buf_s
anitize
(
dbuffer
[
di
]
);
/* force NUL termination */
si
=
di
;
/* swap buffers */
}
else
{
tgt
->
size
=
0
;
...
...
src/pack-objects.c
View file @
af567e88
...
...
@@ -1278,6 +1278,7 @@ int git_packbuilder_foreach(git_packbuilder *pb, int (*cb)(void *buf, size_t siz
int
git_packbuilder_write_buf
(
git_buf
*
buf
,
git_packbuilder
*
pb
)
{
PREPARE_PACK
;
git_buf_sanitize
(
buf
);
return
write_pack
(
pb
,
&
write_pack_buf
,
buf
);
}
...
...
src/submodule.c
View file @
af567e88
...
...
@@ -641,7 +641,9 @@ int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *ur
{
int
error
=
0
;
assert
(
url
);
assert
(
out
&&
repo
&&
url
);
git_buf_sanitize
(
out
);
if
(
git_path_is_relative
(
url
))
{
if
(
!
(
error
=
get_url_base
(
out
,
repo
)))
...
...
tests/object/blob/filter.c
View file @
af567e88
...
...
@@ -112,7 +112,7 @@ void test_object_blob_filter__to_odb(void)
git_config
*
cfg
;
int
i
;
git_blob
*
blob
;
git_buf
out
=
GIT_BUF_INIT
;
git_buf
out
=
GIT_BUF_INIT
,
zeroed
;
cl_git_pass
(
git_repository_config
(
&
cfg
,
g_repo
));
cl_assert
(
cfg
);
...
...
@@ -127,13 +127,20 @@ void test_object_blob_filter__to_odb(void)
for
(
i
=
0
;
i
<
CRLF_NUM_TEST_OBJECTS
;
i
++
)
{
cl_git_pass
(
git_blob_lookup
(
&
blob
,
g_repo
,
&
g_crlf_oids
[
i
]));
/* try once with allocated blob */
cl_git_pass
(
git_filter_list_apply_to_blob
(
&
out
,
fl
,
blob
));
cl_assert_equal_sz
(
g_crlf_filtered
[
i
].
size
,
out
.
size
);
cl_assert_equal_i
(
0
,
memcmp
(
out
.
ptr
,
g_crlf_filtered
[
i
].
ptr
,
out
.
size
));
/* try again with zeroed blob */
memset
(
&
zeroed
,
0
,
sizeof
(
zeroed
));
cl_git_pass
(
git_filter_list_apply_to_blob
(
&
zeroed
,
fl
,
blob
));
cl_assert_equal_sz
(
g_crlf_filtered
[
i
].
size
,
zeroed
.
size
);
cl_assert_equal_i
(
0
,
memcmp
(
zeroed
.
ptr
,
g_crlf_filtered
[
i
].
ptr
,
zeroed
.
size
));
git_buf_free
(
&
zeroed
);
git_blob_free
(
blob
);
}
...
...
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