Fix bug #12: asserts in adc_msg_parse -> enabled strict utf8 parsing.
Signed-off-by: Jan Vidar Krey <janvidar@extatic.org>
This commit is contained in:
parent
ab4eb6db3d
commit
7aeb8651ba
|
@ -1,6 +1,7 @@
|
||||||
0.2.8:
|
0.2.8:
|
||||||
- Fix bug #13: getsockname() failure, use sockaddr from accept() instead.
|
- Fix bug #13: getsockname() failure, use sockaddr from accept() instead.
|
||||||
- Fix bug #10: Improve logging, ensure logs are machine readable.
|
- Fix bug #10: Improve logging, ensure logs are machine readable.
|
||||||
|
- Fix bug #12: asserts in adc_msg_parse -> enabled strict utf8 parsing.
|
||||||
|
|
||||||
|
|
||||||
0.2.7:
|
0.2.7:
|
||||||
|
|
|
@ -26,8 +26,6 @@
|
||||||
uhub_assert(X->capacity); \
|
uhub_assert(X->capacity); \
|
||||||
uhub_assert(X->length); \
|
uhub_assert(X->length); \
|
||||||
uhub_assert(X->length <= X->capacity); \
|
uhub_assert(X->length <= X->capacity); \
|
||||||
if (X->length != strlen(X->cache)) \
|
|
||||||
hub_log(log_error, "Assert: X->length (%d) != strlen(X->cache) (%d)", X->length, strlen(X->cache)); \
|
|
||||||
uhub_assert(X->length == strlen(X->cache)); \
|
uhub_assert(X->length == strlen(X->cache)); \
|
||||||
uhub_assert(X->references >= 0);
|
uhub_assert(X->references >= 0);
|
||||||
#else
|
#else
|
||||||
|
@ -266,6 +264,13 @@ struct adc_message* adc_msg_parse(const char* line, size_t length)
|
||||||
if (command == NULL)
|
if (command == NULL)
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
|
|
||||||
|
if (!is_printable_utf8(line, length))
|
||||||
|
{
|
||||||
|
hub_log(log_debug, "Dropped message with non-printable UTF-8 characters.");
|
||||||
|
hub_free(command);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (line[length-1] != '\n')
|
if (line[length-1] != '\n')
|
||||||
{
|
{
|
||||||
need_terminate = 1;
|
need_terminate = 1;
|
||||||
|
|
35
src/misc.c
35
src/misc.c
|
@ -31,6 +31,16 @@ int is_white_space(char c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_printable(char c)
|
||||||
|
{
|
||||||
|
if (c >= 32)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (c == '\t' || c == '\r' || c == '\n')
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char* strip_white_space(char* string)
|
char* strip_white_space(char* string)
|
||||||
{
|
{
|
||||||
|
@ -48,17 +58,15 @@ char* strip_white_space(char* string)
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_valid_utf8_str(const char* string, size_t length)
|
||||||
int is_valid_utf8(const char* string)
|
|
||||||
{
|
{
|
||||||
int expect = 0;
|
int expect = 0;
|
||||||
char div = 0;
|
char div = 0;
|
||||||
int pos = 0;
|
size_t pos = 0;
|
||||||
int length = strlen(string);
|
|
||||||
|
|
||||||
if (length == 0) return 1;
|
if (length == 0) return 1;
|
||||||
|
|
||||||
for (pos = 0; pos < strlen(string); pos++)
|
for (pos = 0; pos < length; pos++)
|
||||||
{
|
{
|
||||||
if (expect)
|
if (expect)
|
||||||
{
|
{
|
||||||
|
@ -74,13 +82,28 @@ int is_valid_utf8(const char* string)
|
||||||
if (string[pos] & div) expect++;
|
if (string[pos] & div) expect++;
|
||||||
else break;
|
else break;
|
||||||
}
|
}
|
||||||
if ((string[pos] & div) || (pos+expect >= strlen(string))) return 0;
|
if ((string[pos] & div) || (pos+expect >= length)) return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_valid_utf8(const char* string)
|
||||||
|
{
|
||||||
|
return is_valid_utf8_str(string, strlen(string));
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_printable_utf8(const char* string, size_t length)
|
||||||
|
{
|
||||||
|
size_t pos = 0;
|
||||||
|
for (pos = 0; pos < length; pos++)
|
||||||
|
{
|
||||||
|
if (!is_printable(string[pos]))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return is_valid_utf8_str(string, length);
|
||||||
|
}
|
||||||
|
|
||||||
int is_valid_base32_char(char c)
|
int is_valid_base32_char(char c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,6 +26,7 @@ extern int is_num(char c);
|
||||||
extern int is_space(char c);
|
extern int is_space(char c);
|
||||||
extern int is_white_space(char c);
|
extern int is_white_space(char c);
|
||||||
extern int is_valid_utf8(const char* string);
|
extern int is_valid_utf8(const char* string);
|
||||||
|
extern int is_printable_utf8(const char* string, size_t length);
|
||||||
extern int is_valid_base32_char(char c);
|
extern int is_valid_base32_char(char c);
|
||||||
extern void base32_encode(const unsigned char* buffer, size_t len, char* result);
|
extern void base32_encode(const unsigned char* buffer, size_t len, char* result);
|
||||||
extern void base32_decode(const char* src, unsigned char* dst, size_t len);
|
extern void base32_decode(const char* src, unsigned char* dst, size_t len);
|
||||||
|
|
Loading…
Reference in New Issue