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;