From 16f7714c2cc9e89fbaf5b1bb7790f358d1fe4672 Mon Sep 17 00:00:00 2001 From: Aiden Luo Date: Thu, 23 Aug 2018 15:20:19 +0800 Subject: [PATCH 1/4] GUACAMOLE-614: Fix infinite loop in guac_iconv --- src/common/iconv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/common/iconv.c b/src/common/iconv.c index f4cc6c50..e1d7b4ab 100644 --- a/src/common/iconv.c +++ b/src/common/iconv.c @@ -73,11 +73,19 @@ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, /* Read character */ read_start = *input; value = reader(input, in_remaining); + /* Stop if not enough bytes to read */ + if (*input - read_start == 0) { + return 1; + } in_remaining -= *input - read_start; /* Write character */ write_start = *output; writer(output, out_remaining, value); + /* Stop if not enough room */ + if (*output - write_start == 0 ) { + return 1; + } out_remaining -= *output - write_start; /* Stop if null terminator reached */ From 94b425972a69a1469f01ff2eec06bd47ec30354c Mon Sep 17 00:00:00 2001 From: Aiden Luo Date: Fri, 24 Aug 2018 08:38:04 +0800 Subject: [PATCH 2/4] GUACAMOLE-614: Update code style --- src/common/iconv.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/common/iconv.c b/src/common/iconv.c index e1d7b4ab..e512cf82 100644 --- a/src/common/iconv.c +++ b/src/common/iconv.c @@ -67,26 +67,27 @@ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, while (in_remaining > 0 && out_remaining > 0) { int value; + int count; const char* read_start; char* write_start; /* Read character */ read_start = *input; value = reader(input, in_remaining); + count = *input - read_start; /* Stop if not enough bytes to read */ - if (*input - read_start == 0) { + if (count == 0) return 1; - } - in_remaining -= *input - read_start; + in_remaining -= count; /* Write character */ write_start = *output; writer(output, out_remaining, value); + count = *output - write_start; /* Stop if not enough room */ - if (*output - write_start == 0 ) { + if (count == 0) return 1; - } - out_remaining -= *output - write_start; + out_remaining -= count; /* Stop if null terminator reached */ if (value == 0) From 98cc222e74c70e7a4effa437d8e517f05d1676d6 Mon Sep 17 00:00:00 2001 From: Aiden Luo Date: Fri, 24 Aug 2018 15:44:10 +0800 Subject: [PATCH 3/4] GUACAMOLE-614: Update comment --- src/common/iconv.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/common/iconv.c b/src/common/iconv.c index e512cf82..ddc736fc 100644 --- a/src/common/iconv.c +++ b/src/common/iconv.c @@ -75,18 +75,22 @@ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, read_start = *input; value = reader(input, in_remaining); count = *input - read_start; - /* Stop if not enough bytes to read */ + + /* Stop if read zero byte */ if (count == 0) - return 1; + break; + in_remaining -= count; /* Write character */ write_start = *output; writer(output, out_remaining, value); count = *output - write_start; - /* Stop if not enough room */ + + /* Stop if write zero byte */ if (count == 0) - return 1; + break; + out_remaining -= count; /* Stop if null terminator reached */ From 2804098f4ff84eb33fcff980767f3b9b4d174e3b Mon Sep 17 00:00:00 2001 From: Aiden Luo Date: Tue, 28 Aug 2018 18:28:44 +0800 Subject: [PATCH 4/4] GUACAMOLE-614: Fix uninitialized local variable --- src/common/iconv.c | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/common/iconv.c b/src/common/iconv.c index ddc736fc..4d87e2e2 100644 --- a/src/common/iconv.c +++ b/src/common/iconv.c @@ -67,31 +67,18 @@ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, while (in_remaining > 0 && out_remaining > 0) { int value; - int count; const char* read_start; char* write_start; /* Read character */ read_start = *input; value = reader(input, in_remaining); - count = *input - read_start; - - /* Stop if read zero byte */ - if (count == 0) - break; - - in_remaining -= count; + in_remaining -= *input - read_start; /* Write character */ write_start = *output; writer(output, out_remaining, value); - count = *output - write_start; - - /* Stop if write zero byte */ - if (count == 0) - break; - - out_remaining -= count; + out_remaining -= *output - write_start; /* Stop if null terminator reached */ if (value == 0) @@ -106,7 +93,7 @@ int guac_iconv(guac_iconv_read* reader, const char** input, int in_remaining, int GUAC_READ_UTF8(const char** input, int remaining) { - int value; + int value = 0; *input += guac_utf8_read(*input, remaining, &value); return value;