Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2e1e0f1

Browse files
committed
blame: Do not assume blob contents are NULL-terminated
1 parent 1ba48b7 commit 2e1e0f1

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

examples/blame.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static void parse_opts(struct opts *o, int argc, char *argv[]);
3838
int main(int argc, char *argv[])
3939
{
4040
int i, line, break_on_null_hunk;
41+
size_t rawsize;
4142
char spec[1024] = {0};
4243
struct opts o = {0};
4344
const char *rawdata;
@@ -94,32 +95,33 @@ int main(int argc, char *argv[])
9495
git_object_free(obj);
9596

9697
rawdata = git_blob_rawcontent(blob);
98+
rawsize = git_blob_rawsize(blob);
9799

98100
/** Produce the output. */
99101
line = 1;
100102
i = 0;
101103
break_on_null_hunk = 0;
102-
while (i < git_blob_rawsize(blob)) {
103-
const char *eol = strchr(rawdata+i, '\n');
104+
while (i < rawsize) {
105+
const char *eol = memchr(rawdata + i, '\n', rawsize - i);
104106
char oid[10] = {0};
105107
const git_blame_hunk *hunk = git_blame_get_hunk_byline(blame, line);
106108

107-
if (break_on_null_hunk && !hunk) break;
109+
if (break_on_null_hunk && !hunk)
110+
break;
108111

109112
if (hunk) {
110113
char sig[128] = {0};
111114
break_on_null_hunk = 1;
112115

113-
114116
git_oid_tostr(oid, 10, &hunk->final_commit_id);
115117
snprintf(sig, 30, "%s <%s>", hunk->final_signature->name, hunk->final_signature->email);
116118

117119
printf("%s ( %-30s %3d) %.*s\n",
118120
oid,
119121
sig,
120122
line,
121-
(int)(eol-rawdata-i),
122-
rawdata+i);
123+
(int)(eol - rawdata - i),
124+
rawdata + i);
123125
}
124126

125127
i = (int)(eol - rawdata + 1);

0 commit comments

Comments
 (0)