pkt-line: share buffer/descriptor reading implementation
The packet_read function reads from a descriptor. The packet_get_line function is similar, but reads from an in-memory buffer, and uses a completely separate implementation. This patch teaches the generic packet_read function to accept either source, and we can do away with packet_get_line's implementation. There are two other differences to account for between the old and new functions. The first is that we used to read into a strbuf, but now read into a fixed size buffer. The only two callers are fine with that, and in fact it simplifies their code, since they can use the same static-buffer interface as the rest of the packet_read_line callers (and we provide a similar convenience wrapper for reading from a buffer rather than a descriptor). This is technically an externally-visible behavior change in that we used to accept arbitrary sized packets up to 65532 bytes, and now cap out at LARGE_PACKET_MAX, 65520. In practice this doesn't matter, as we use it only for parsing smart-http headers (of which there is exactly one defined, and it is small and fixed-size). And any extension headers would be breaking the protocol to go over LARGE_PACKET_MAX anyway. The other difference is that packet_get_line would return on error rather than dying. However, both callers of packet_get_line are actually improved by dying. The first caller does its own error checking, but we can drop that; as a result, we'll actually get more specific reporting about protocol breakage when packet_read dies internally. The only downside is that packet_read will not print the smart-http URL that failed, but that's not a big deal; anybody not debugging can already see the remote's URL already, and anybody debugging would want to run with GIT_CURL_VERBOSE anyway to see way more information. The second caller, which is just trying to skip past any extra smart-http headers (of which there are none defined, but which we allow to keep room for future expansion), did not error check at all. As a result, it would treat an error just like a flush packet. The resulting mess would generally cause an error later in get_remote_heads, but now we get error reporting much closer to the source of the problem. Brown-paper-bag-fixes-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
74543a0423
commit
4981fe750b
23
pkt-line.h
23
pkt-line.h
@ -25,9 +25,16 @@ void packet_buf_flush(struct strbuf *buf);
|
||||
void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
|
||||
|
||||
/*
|
||||
* Read a packetized line from the descriptor into the buffer, which must be at
|
||||
* least size bytes long. The return value specifies the number of bytes read
|
||||
* into the buffer.
|
||||
* Read a packetized line into the buffer, which must be at least size bytes
|
||||
* long. The return value specifies the number of bytes read into the buffer.
|
||||
*
|
||||
* If src_buffer is not NULL (and nor is *src_buffer), it should point to a
|
||||
* buffer containing the packet data to parse, of at least *src_len bytes.
|
||||
* After the function returns, src_buf will be incremented and src_len
|
||||
* decremented by the number of bytes consumed.
|
||||
*
|
||||
* If src_buffer (or *src_buffer) is NULL, then data is read from the
|
||||
* descriptor "fd".
|
||||
*
|
||||
* If options does not contain PACKET_READ_GENTLE_ON_EOF, we will die under any
|
||||
* of the following conditions:
|
||||
@ -50,7 +57,8 @@ void packet_buf_write(struct strbuf *buf, const char *fmt, ...) __attribute__((f
|
||||
*/
|
||||
#define PACKET_READ_GENTLE_ON_EOF (1u<<0)
|
||||
#define PACKET_READ_CHOMP_NEWLINE (1u<<1)
|
||||
int packet_read(int fd, char *buffer, unsigned size, int options);
|
||||
int packet_read(int fd, char **src_buffer, size_t *src_len, char
|
||||
*buffer, unsigned size, int options);
|
||||
|
||||
/*
|
||||
* Convenience wrapper for packet_read that is not gentle, and sets the
|
||||
@ -61,11 +69,14 @@ int packet_read(int fd, char *buffer, unsigned size, int options);
|
||||
*/
|
||||
char *packet_read_line(int fd, int *size);
|
||||
|
||||
/*
|
||||
* Same as packet_read_line, but read from a buf rather than a descriptor;
|
||||
* see packet_read for details on how src_* is used.
|
||||
*/
|
||||
char *packet_read_line_buf(char **src_buf, size_t *src_len, int *size);
|
||||
|
||||
#define DEFAULT_PACKET_MAX 1000
|
||||
#define LARGE_PACKET_MAX 65520
|
||||
extern char packet_buffer[LARGE_PACKET_MAX];
|
||||
|
||||
int packet_get_line(struct strbuf *out, char **src_buf, size_t *src_len);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user