[PATCH 1/2] sideband.c: Use xmalloc() instead of variable-sized arrays.
From: Johannes Sixt <hidden>
Date: 2016-06-15 22:44:03
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Johannes Sixt <redacted> How come we got along with this not very portable construct for so long? Probably because the array sizes were computed from the results of strlen() of string constants. Anyway, a follow-up patch will make the lengths really non-constant. Signed-off-by: Johannes Sixt <redacted> --- sideband.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/sideband.c b/sideband.c
index 756bbc2..513d7b3 100644
--- a/sideband.c
+++ b/sideband.c@@ -19,7 +19,10 @@ int recv_sideband(const char *me, int in_stream, int out, int err) { unsigned pf = strlen(PREFIX); unsigned sf = strlen(SUFFIX); - char buf[pf + LARGE_PACKET_MAX + sf + 1]; + char *buf, *save; + + save = xmalloc(sf); + buf = xmalloc(pf + LARGE_PACKET_MAX + sf + 1); memcpy(buf, PREFIX, pf); while (1) { int band, len;
@@ -29,6 +32,8 @@ int recv_sideband(const char *me, int in_stream, int out, int err) if (len < 1) { len = sprintf(buf, "%s: protocol error: no band designator\n", me); safe_write(err, buf, len); + free(buf); + free(save); return SIDEBAND_PROTOCOL_ERROR; } band = buf[pf] & 0xff;
@@ -38,6 +43,8 @@ int recv_sideband(const char *me, int in_stream, int out, int err) buf[pf] = ' '; buf[pf+1+len] = '\n'; safe_write(err, buf, pf+1+len+1); + free(buf); + free(save); return SIDEBAND_REMOTE_ERROR; case 2: buf[pf] = ' ';
@@ -59,7 +66,6 @@ int recv_sideband(const char *me, int in_stream, int out, int err) * line data actually contains something. */ if (brk > pf+1 + 1) { - char save[sf]; memcpy(save, buf + brk, sf); buf[brk + sf - 1] = buf[brk - 1]; memcpy(buf + brk - 1, SUFFIX, sf);
@@ -83,9 +89,13 @@ int recv_sideband(const char *me, int in_stream, int out, int err) "%s: protocol error: bad band #%d\n", me, band); safe_write(err, buf, len); + free(buf); + free(save); return SIDEBAND_PROTOCOL_ERROR; } } + free(buf); + free(save); return 0; }
--
1.5.4.rc2.815.g2f849-dirty