]> git.ipfire.org Git - thirdparty/git.git/blobdiff - connect.c
The sixth batch
[thirdparty/git.git] / connect.c
index 23013c634436adeeac65bd5e6a0d895a06fe6fe6..0df45a110888e53e4d6f3f86bafc76abcd096297 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -127,6 +127,7 @@ enum protocol_version discover_version(struct packet_reader *reader)
                die_initial_contact(0);
        case PACKET_READ_FLUSH:
        case PACKET_READ_DELIM:
+       case PACKET_READ_RESPONSE_END:
                version = protocol_v0;
                break;
        case PACKET_READ_NORMAL:
@@ -310,6 +311,7 @@ struct ref **get_remote_heads(struct packet_reader *reader,
                        state = EXPECTING_DONE;
                        break;
                case PACKET_READ_DELIM:
+               case PACKET_READ_RESPONSE_END:
                        die(_("invalid packet"));
                }
 
@@ -404,10 +406,21 @@ out:
        return ret;
 }
 
+void check_stateless_delimiter(int stateless_rpc,
+                             struct packet_reader *reader,
+                             const char *error)
+{
+       if (!stateless_rpc)
+               return; /* not in stateless mode, no delimiter expected */
+       if (packet_reader_read(reader) != PACKET_READ_RESPONSE_END)
+               die("%s", error);
+}
+
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                             struct ref **list, int for_push,
                             const struct argv_array *ref_prefixes,
-                            const struct string_list *server_options)
+                            const struct string_list *server_options,
+                            int stateless_rpc)
 {
        int i;
        *list = NULL;
@@ -444,6 +457,9 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
        if (reader->status != PACKET_READ_FLUSH)
                die(_("expected flush after ref listing"));
 
+       check_stateless_delimiter(stateless_rpc, reader,
+                                 _("expected response end packet after ref listing"));
+
        return list;
 }