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 {