Skip to content

Commit 875b91b

Browse files
committed
diff --no-index: use strbuf for temporary pathnames
Instead of using limited-length buffers and risking of pathname truncation, we should be taking advantage of strbuf API nowadays. Signed-off-by: Junio C Hamano <[email protected]>
1 parent 48e510b commit 875b91b

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

diff-no-index.c

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static int get_mode(const char *path, int *mode)
5252
}
5353

5454
static int queue_diff(struct diff_options *o,
55-
const char *name1, const char *name2)
55+
const char *name1, const char *name2)
5656
{
5757
int mode1 = 0, mode2 = 0;
5858

@@ -63,10 +63,11 @@ static int queue_diff(struct diff_options *o,
6363
return error("file/directory conflict: %s, %s", name1, name2);
6464

6565
if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
66-
char buffer1[PATH_MAX], buffer2[PATH_MAX];
66+
struct strbuf buffer1 = STRBUF_INIT;
67+
struct strbuf buffer2 = STRBUF_INIT;
6768
struct string_list p1 = STRING_LIST_INIT_DUP;
6869
struct string_list p2 = STRING_LIST_INIT_DUP;
69-
int len1 = 0, len2 = 0, i1, i2, ret = 0;
70+
int i1, i2, ret = 0;
7071

7172
if (name1 && read_directory(name1, &p1))
7273
return -1;
@@ -76,19 +77,15 @@ static int queue_diff(struct diff_options *o,
7677
}
7778

7879
if (name1) {
79-
len1 = strlen(name1);
80-
if (len1 > 0 && name1[len1 - 1] == '/')
81-
len1--;
82-
memcpy(buffer1, name1, len1);
83-
buffer1[len1++] = '/';
80+
strbuf_addstr(&buffer1, name1);
81+
if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
82+
strbuf_addch(&buffer1, '/');
8483
}
8584

8685
if (name2) {
87-
len2 = strlen(name2);
88-
if (len2 > 0 && name2[len2 - 1] == '/')
89-
len2--;
90-
memcpy(buffer2, name2, len2);
91-
buffer2[len2++] = '/';
86+
strbuf_addstr(&buffer2, name2);
87+
if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
88+
strbuf_addch(&buffer2, '/');
9289
}
9390

9491
for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
@@ -100,31 +97,28 @@ static int queue_diff(struct diff_options *o,
10097
else if (i2 == p2.nr)
10198
comp = -1;
10299
else
103-
comp = strcmp(p1.items[i1].string,
104-
p2.items[i2].string);
100+
comp = strcmp(p1.items[i1].string, p2.items[i2].string);
105101

106102
if (comp > 0)
107103
n1 = NULL;
108104
else {
109-
n1 = buffer1;
110-
strncpy(buffer1 + len1, p1.items[i1++].string,
111-
PATH_MAX - len1);
112-
buffer1[PATH_MAX-1] = 0;
105+
strbuf_addstr(&buffer1, p1.items[i1++].string);
106+
n1 = buffer1.buf;
113107
}
114108

115109
if (comp < 0)
116110
n2 = NULL;
117111
else {
118-
n2 = buffer2;
119-
strncpy(buffer2 + len2, p2.items[i2++].string,
120-
PATH_MAX - len2);
121-
buffer2[PATH_MAX-1] = 0;
112+
strbuf_addstr(&buffer2, p2.items[i2++].string);
113+
n2 = buffer2.buf;
122114
}
123115

124116
ret = queue_diff(o, n1, n2);
125117
}
126118
string_list_clear(&p1, 0);
127119
string_list_clear(&p2, 0);
120+
strbuf_reset(&buffer1);
121+
strbuf_reset(&buffer2);
128122

129123
return ret;
130124
} else {

0 commit comments

Comments
 (0)