Skip to content

Commit f1986a2

Browse files
committed
streams: don't write more than SSIZE_MAX
Our streams implementation takes a `size_t` that indicates the length of the data buffer to be written, and returns an `ssize_t` that indicates the length that _was_ written. Clearly no such implementation can write more than `SSIZE_MAX` bytes. Ensure that each TLS stream implementation does not try to write more than `SSIZE_MAX` bytes (or smaller; if the given implementation takes a smaller size).
1 parent e5e2fac commit f1986a2

File tree

4 files changed

+13
-13
lines changed

4 files changed

+13
-13
lines changed

src/streams/mbedtls.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,22 +303,22 @@ static int mbedtls_set_proxy(git_stream *stream, const git_proxy_options *proxy_
303303
return git_stream_set_proxy(st->io, proxy_options);
304304
}
305305

306-
ssize_t mbedtls_stream_write(git_stream *stream, const char *data, size_t len, int flags)
306+
ssize_t mbedtls_stream_write(git_stream *stream, const char *data, size_t data_len, int flags)
307307
{
308-
size_t read = 0;
308+
ssize_t written = 0, len = min(data_len, SSIZE_MAX);
309309
mbedtls_stream *st = (mbedtls_stream *) stream;
310310

311311
GIT_UNUSED(flags);
312312

313313
do {
314-
int error = mbedtls_ssl_write(st->ssl, (const unsigned char *)data + read, len - read);
314+
int error = mbedtls_ssl_write(st->ssl, (const unsigned char *)data + written, len - written);
315315
if (error <= 0) {
316316
return ssl_set_error(st->ssl, error);
317317
}
318-
read += error;
319-
} while (read < len);
318+
written += error;
319+
} while (written < len);
320320

321-
return read;
321+
return written;
322322
}
323323

324324
ssize_t mbedtls_stream_read(git_stream *stream, void *data, size_t len)

src/streams/openssl.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,10 +644,10 @@ static int openssl_set_proxy(git_stream *stream, const git_proxy_options *proxy_
644644
return git_stream_set_proxy(st->io, proxy_opts);
645645
}
646646

647-
ssize_t openssl_write(git_stream *stream, const char *data, size_t len, int flags)
647+
ssize_t openssl_write(git_stream *stream, const char *data, size_t data_len, int flags)
648648
{
649649
openssl_stream *st = (openssl_stream *) stream;
650-
int ret;
650+
int ret, len = min(data_len, INT_MAX);
651651

652652
GIT_UNUSED(flags);
653653

src/streams/socket.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,9 @@ int socket_connect(git_stream *stream)
130130
return 0;
131131
}
132132

133-
ssize_t socket_write(git_stream *stream, const char *data, size_t len, int flags)
133+
ssize_t socket_write(git_stream *stream, const char *data, size_t data_len, int flags)
134134
{
135-
ssize_t ret;
136-
size_t off = 0;
135+
ssize_t ret, off = 0, len = min(data_len, SSIZE_MAX);
137136
git_socket_stream *st = (git_socket_stream *) stream;
138137

139138
while (off < len) {

src/streams/stransport.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,12 @@ static ssize_t stransport_write(git_stream *stream, const char *data, size_t len
164164

165165
GIT_UNUSED(flags);
166166

167-
data_len = len;
167+
data_len = min(len, SSIZE_MAX);
168168
if ((ret = SSLWrite(st->ctx, data, data_len, &processed)) != noErr)
169169
return stransport_error(ret);
170170

171-
return processed;
171+
assert(processed < SSIZE_MAX);
172+
return (ssize_t)processed;
172173
}
173174

174175
/*

0 commit comments

Comments
 (0)