diff options
-rw-r--r-- | apps/tagtree.c | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/apps/tagtree.c b/apps/tagtree.c index 31470722d5..5012c084d0 100644 --- a/apps/tagtree.c +++ b/apps/tagtree.c | |||
@@ -1096,10 +1096,10 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt, | |||
1096 | } | 1096 | } |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | char formatchar = fmt->formatstr[i]; | ||
1100 | |||
1099 | if (read_format) | 1101 | if (read_format) |
1100 | { | 1102 | { |
1101 | char formatchar = fmt->formatstr[i]; | ||
1102 | |||
1103 | fmtbuf[fmtbuf_pos++] = formatchar; | 1103 | fmtbuf[fmtbuf_pos++] = formatchar; |
1104 | if (fmtbuf_pos >= sizeof fmtbuf) | 1104 | if (fmtbuf_pos >= sizeof fmtbuf) |
1105 | { | 1105 | { |
@@ -1110,7 +1110,7 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt, | |||
1110 | if (formatchar == 's' || formatchar == 'd') | 1110 | if (formatchar == 's' || formatchar == 'd') |
1111 | { | 1111 | { |
1112 | unsigned space_left = buf_size - buf_pos; | 1112 | unsigned space_left = buf_size - buf_pos; |
1113 | char tmpbuf[space_left + 1]; | 1113 | char tmpbuf[MAX_PATH]; |
1114 | char *result; | 1114 | char *result; |
1115 | 1115 | ||
1116 | fmtbuf[fmtbuf_pos] = '\0'; | 1116 | fmtbuf[fmtbuf_pos] = '\0'; |
@@ -1131,7 +1131,7 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt, | |||
1131 | if (!tagcache_retrieve(tcs, tcs->idx_id, | 1131 | if (!tagcache_retrieve(tcs, tcs->idx_id, |
1132 | (tag == tag_virt_basename ? | 1132 | (tag == tag_virt_basename ? |
1133 | tag_filename : tag), | 1133 | tag_filename : tag), |
1134 | tmpbuf, space_left)) | 1134 | tmpbuf, sizeof tmpbuf)) |
1135 | { | 1135 | { |
1136 | logf("retrieve failed"); | 1136 | logf("retrieve failed"); |
1137 | return -3; | 1137 | return -3; |
@@ -1145,22 +1145,23 @@ static int format_str(struct tagcache_search *tcs, struct display_format *fmt, | |||
1145 | else | 1145 | else |
1146 | result = tmpbuf; | 1146 | result = tmpbuf; |
1147 | } | 1147 | } |
1148 | snprintf(&buf[buf_pos], space_left, fmtbuf, result); | 1148 | buf_pos += |
1149 | snprintf(&buf[buf_pos], space_left, fmtbuf, result); | ||
1149 | break; | 1150 | break; |
1150 | 1151 | ||
1151 | case 'd': | 1152 | case 'd': |
1152 | snprintf(&buf[buf_pos], space_left, fmtbuf, | 1153 | buf_pos += |
1153 | tagcache_get_numeric(tcs, fmt->tags[parpos])); | 1154 | snprintf(&buf[buf_pos], space_left, fmtbuf, |
1155 | tagcache_get_numeric(tcs, fmt->tags[parpos])); | ||
1154 | } | 1156 | } |
1155 | 1157 | ||
1156 | buf_pos += strlen(&buf[buf_pos]); | ||
1157 | parpos++; | 1158 | parpos++; |
1158 | } | 1159 | } |
1159 | } | 1160 | } |
1160 | else | 1161 | else |
1161 | buf[buf_pos++] = fmt->formatstr[i]; | 1162 | buf[buf_pos++] = formatchar; |
1162 | 1163 | ||
1163 | if (buf_pos - 1 >= buf_size) | 1164 | if (buf_pos >= buf_size - 1) /* need at least one more byte for \0 */ |
1164 | { | 1165 | { |
1165 | logf("buffer overflow"); | 1166 | logf("buffer overflow"); |
1166 | return -4; | 1167 | return -4; |
@@ -1328,35 +1329,41 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init) | |||
1328 | 1329 | ||
1329 | if (!tcs.ramresult || fmt) | 1330 | if (!tcs.ramresult || fmt) |
1330 | { | 1331 | { |
1331 | char buf[MAX_PATH]; | 1332 | dptr->name = &c->cache.name_buffer[namebufused]; |
1332 | 1333 | ||
1333 | if (fmt) | 1334 | if (fmt) |
1334 | { | 1335 | { |
1335 | if (format_str(&tcs, fmt, buf, sizeof buf) < 0) | 1336 | int ret = format_str(&tcs, fmt, dptr->name, |
1337 | c->cache.name_buffer_size - namebufused); | ||
1338 | if (ret == -4) /* buffer full */ | ||
1339 | { | ||
1340 | logf("chunk mode #2: %d", current_entry_count); | ||
1341 | c->dirfull = true; | ||
1342 | sort = false; | ||
1343 | break ; | ||
1344 | } | ||
1345 | else if (ret < 0) | ||
1336 | { | 1346 | { |
1337 | logf("format_str() failed"); | 1347 | logf("format_str() failed"); |
1338 | tagcache_search_finish(&tcs); | 1348 | tagcache_search_finish(&tcs); |
1339 | return 0; | 1349 | return 0; |
1340 | } | 1350 | } |
1351 | else | ||
1352 | namebufused += strlen(dptr->name)+1; | ||
1341 | } | 1353 | } |
1342 | |||
1343 | dptr->name = &c->cache.name_buffer[namebufused]; | ||
1344 | if (fmt) | ||
1345 | namebufused += strlen(buf)+1; | ||
1346 | else | 1354 | else |
1347 | namebufused += tcs.result_len; | ||
1348 | |||
1349 | if (namebufused >= c->cache.name_buffer_size) | ||
1350 | { | 1355 | { |
1351 | logf("chunk mode #2: %d", current_entry_count); | 1356 | namebufused += tcs.result_len; |
1352 | c->dirfull = true; | 1357 | if (namebufused < c->cache.name_buffer_size) |
1353 | sort = false; | 1358 | strcpy(dptr->name, tcs.result); |
1354 | break ; | 1359 | else |
1360 | { | ||
1361 | logf("chunk mode #2a: %d", current_entry_count); | ||
1362 | c->dirfull = true; | ||
1363 | sort = false; | ||
1364 | break ; | ||
1365 | } | ||
1355 | } | 1366 | } |
1356 | if (fmt) | ||
1357 | strcpy(dptr->name, buf); | ||
1358 | else | ||
1359 | strcpy(dptr->name, tcs.result); | ||
1360 | } | 1367 | } |
1361 | else | 1368 | else |
1362 | dptr->name = tcs.result; | 1369 | dptr->name = tcs.result; |