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 <gitster@pobox.com>
Junio C Hamano committed
Apr 25, 2012 at 12:37 UTC
875b91b35d2517773495e8404f31fde8c5cbd27d
1 file changed
+17
-23
diff-no-index.c
+17
-23
@@ -52,7 +52,7 @@ static int get_mode(const char *path, int *mode)
52
}
53
54
static int queue_diff(struct diff_options *o,
55
- const char *name1, const char *name2)
55
+ const char *name1, const char *name2)
56
{
57
int mode1 = 0, mode2 = 0;
58
@@ -63,10 +63,11 @@ static int queue_diff(struct diff_options *o,
63
return error("file/directory conflict: %s, %s", name1, name2);
64
65
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;
68
struct string_list p1 = STRING_LIST_INIT_DUP;
69
struct string_list p2 = STRING_LIST_INIT_DUP;
69
- int len1 = 0, len2 = 0, i1, i2, ret = 0;
70
+ int i1, i2, ret = 0;
71
72
if (name1 && read_directory(name1, &p1))
73
return -1;
@@ -76,19 +77,15 @@ static int queue_diff(struct diff_options *o,
77
}
78
79
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, '/');
83
}
84
85
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, '/');
89
}
90
91
for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
@@ -100,31 +97,28 @@ static int queue_diff(struct diff_options *o,
97
else if (i2 == p2.nr)
98
comp = -1;
99
else
103
- comp = strcmp(p1.items[i1].string,
104
- p2.items[i2].string);
100
+ comp = strcmp(p1.items[i1].string, p2.items[i2].string);
101
102
if (comp > 0)
103
n1 = NULL;
104
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;
107
}
108
109
if (comp < 0)
110
n2 = NULL;
111
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;
114
}
115
116
ret = queue_diff(o, n1, n2);
117
}
118
string_list_clear(&p1, 0);
119
string_list_clear(&p2, 0);
120
+ strbuf_reset(&buffer1);
121
+ strbuf_reset(&buffer2);
122
123
return ret;
124
} else {