From bd72efbd8073c0e14fa3dacf7da2883c9ea70952 Mon Sep 17 00:00:00 2001 From: Janne Kulmala Date: Tue, 17 Apr 2012 10:53:53 +0300 Subject: [PATCH 1/2] load: Avoid unexpected behaviour in macro expansion Macros can be dangerous if the inserted arguments are not properly parenthesised. As macro expansion does a simple replacement, inserting a certain expression can cause the evaluation order of the macro expression to change. --- src/load.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/load.c b/src/load.c index 70a1ac2..a904599 100644 --- a/src/load.c +++ b/src/load.c @@ -32,12 +32,12 @@ #define TOKEN_NULL 261 /* Locale independent versions of isxxx() functions */ -#define l_isupper(c) ('A' <= c && c <= 'Z') -#define l_islower(c) ('a' <= c && c <= 'z') +#define l_isupper(c) ('A' <= (c) && (c) <= 'Z') +#define l_islower(c) ('a' <= (c) && (c) <= 'z') #define l_isalpha(c) (l_isupper(c) || l_islower(c)) -#define l_isdigit(c) ('0' <= c && c <= '9') +#define l_isdigit(c) ('0' <= (c) && (c) <= '9') #define l_isxdigit(c) \ - (l_isdigit(c) || 'A' <= c || c <= 'F' || 'a' <= c || c <= 'f') + (l_isdigit(c) || 'A' <= (c) || (c) <= 'F' || 'a' <= (c) || (c) <= 'f') /* Read one byte from stream, convert to unsigned char, then int, and return. return EOF on end of file. This corresponds to the From aabfd493d3c79dae4a1d45ca8657bbd7f5aac659 Mon Sep 17 00:00:00 2001 From: Janne Kulmala Date: Tue, 17 Apr 2012 11:05:12 +0300 Subject: [PATCH 2/2] load: Change buffer_pos to be a size_t buffer_pos should be type size_t, because it's used to store the current position in the read buffer. Also, it never can be negative. --- src/load.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/load.c b/src/load.c index a904599..9ad4752 100644 --- a/src/load.c +++ b/src/load.c @@ -48,7 +48,7 @@ typedef struct { get_func get; void *data; char buffer[5]; - int buffer_pos; + size_t buffer_pos; int state; int line; int column, last_column;