fetch-object-info: detect truncated server responses
The loop reading the object-info response stops as soon as the reader returns something other than PACKET_READ_NORMAL. A server that somehow answers with fewer objects leaves the end of the result arrays empty. The caller trusts that every requested object will be filled in. die() if the loop doesn't reach the number of oids expected. Mentored-by: Karthik Nayak <karthik.188@gmail.com> Mentored-by: Chandra Pratap <chandrapratap3519@gmail.com> Signed-off-by: Pablo Sabater <pabloosabaterr@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Pablo Sabater committed
Aug 3, 2026 at 16:39 UTC
4a43c3e9f35a74cab50e88d77d1704d523598136
1 file changed
+8
-2
fetch-object-info.c
+8
-2
@@ -49,6 +49,7 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
49
struct packet_reader *reader, struct object_info *object_info_data,
50
const int stateless_rpc, const int fd_out)
51
{
52
+ size_t i;
53
int size_index = -1;
54
55
switch (version) {
@@ -82,7 +83,7 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
83
BUG("unknown protocol version");
84
}
85
85
- for (size_t i = 0; i < args->object_info_options->nr; i++) {
86
+ for (i = 0; i < args->object_info_options->nr; i++) {
87
if (packet_reader_read(reader) != PACKET_READ_NORMAL) {
88
check_stateless_delimiter(stateless_rpc, reader,
89
"stateless delimiter expected");
@@ -106,7 +107,7 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
107
}
108
}
109
109
- for (size_t i = 0;
110
+ for (i = 0;
111
packet_reader_read(reader) == PACKET_READ_NORMAL &&
112
i < args->oids->nr;
113
i++) {
@@ -150,6 +151,11 @@ int fetch_object_info(const enum protocol_version version, struct object_info_ar
151
152
string_list_clear(&object_info_values, 0);
153
}
154
+
155
+ if (i != args->oids->nr)
156
+ die(_("object-info: expected %" PRIuMAX " objects, got %" PRIuMAX),
157
+ (uintmax_t)args->oids->nr, (uintmax_t)i);
158
+
159
check_stateless_delimiter(stateless_rpc, reader, "stateless delimiter expected");
160
161
return 0;