From e816026faa1ae11f0e9d26d27f420a304d4ad210 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周五, 16 10月 2015 06:16:45 +0800 Subject: [PATCH] Resolve #59: input buffer overrun handling --- libscpi/src/utils.c | 47 +++++++++++++++++++++-------------------------- 1 files changed, 21 insertions(+), 26 deletions(-) diff --git a/libscpi/src/utils.c b/libscpi/src/utils.c index fa8a7f1..f92e877 100644 --- a/libscpi/src/utils.c +++ b/libscpi/src/utils.c @@ -4,7 +4,7 @@ * Copyright (c) 2012 Jan Breuer * * All Rights Reserved - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: @@ -13,7 +13,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -30,10 +30,10 @@ /** * @file scpi_utils.c * @date Thu Nov 15 10:58:45 UTC 2012 - * + * * @brief Conversion routines and string manipulation routines - * - * + * + * */ #include <stdio.h> @@ -53,7 +53,7 @@ * @param str * @param size * @param set - * @return + * @return */ char * strnpbrk(const char *str, size_t size, const char *set) { const char *scanp; @@ -74,7 +74,7 @@ * @param str converted textual representation * @param len string buffer length * @param base output base - * @param sign + * @param sign * @return number of bytes written to str (without '\0') */ size_t UInt32ToStrBaseSign(uint32_t val, char * str, size_t len, int8_t base, scpi_bool_t sign) { @@ -162,7 +162,7 @@ * @param str converted textual representation * @param len string buffer length * @param base output base - * @param sign + * @param sign * @return number of bytes written to str (without '\0') */ size_t UInt64ToStrBaseSign(uint64_t val, char * str, size_t len, int8_t base, scpi_bool_t sign) { @@ -475,7 +475,7 @@ * @param pattern_len * @param str * @param str_len - * @return + * @return */ scpi_bool_t matchPattern(const char * pattern, size_t pattern_len, const char * str, size_t str_len, int32_t * num) { int pattern_sep_pos_short; @@ -508,8 +508,7 @@ #define SKIP_CMD(n) do {cmd_ptr += (n); cmd_len -= (n);} while(0) scpi_bool_t result = FALSE; - int leftFlag = 0; // flag for '[' on left - int rightFlag = 0; // flag for ']' on right + int brackets = 0; int cmd_sep_pos = 0; size_t numbers_idx = 0; @@ -534,7 +533,7 @@ /* now support optional keywords in pattern style, e.g. [:MEASure]:VOLTage:DC? */ if (pattern_ptr[0] == '[') { // skip first '[' SKIP_PATTERN(1); - leftFlag++; + brackets++; } if (pattern_ptr[0] == ':') { // skip first ':' SKIP_PATTERN(1); @@ -554,10 +553,6 @@ while (1) { int pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_len); - if ((leftFlag > 0) && (rightFlag > 0)) { - leftFlag--; - rightFlag--; - } cmd_sep_pos = cmdSeparatorPos(cmd_ptr, cmd_len); if ((pattern_sep_pos > 0) && pattern_ptr[pattern_sep_pos - 1] == '#') { @@ -595,16 +590,16 @@ pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_len); switch (pattern_ptr[pattern_sep_pos]) { case '[': - leftFlag++; + brackets++; break; case ']': - leftFlag--; + brackets--; break; default: break; } SKIP_PATTERN(pattern_sep_pos + 1); - if (leftFlag == 0) { + if (brackets == 0) { if ((pattern_len > 0) && (pattern_ptr[0] == '[')) { continue; } else { @@ -630,14 +625,14 @@ && (pattern_ptr[1] == ':')) { SKIP_PATTERN(2); // for skip '[' in "[:" SKIP_CMD(1); - leftFlag++; + brackets++; } else if ((pattern_len > 1) && (pattern_ptr[1] == cmd_ptr[0]) && (pattern_ptr[0] == ']') && (pattern_ptr[1] == ':')) { SKIP_PATTERN(2); // for skip ']' in "]:" SKIP_CMD(1); - rightFlag++; + brackets--; } else if ((pattern_len > 2) && (pattern_ptr[2] == cmd_ptr[0]) && (pattern_ptr[0] == ']') @@ -645,8 +640,8 @@ && (pattern_ptr[2] == ':')) { SKIP_PATTERN(3); // for skip '][' in "][:" SKIP_CMD(1); - leftFlag++; - rightFlag++; + //brackets++; + //brackets--; } else { result = FALSE; break; @@ -655,13 +650,13 @@ SKIP_PATTERN(pattern_sep_pos); if ((pattern_ptr[0] == ']') && (pattern_ptr[1] == ':')) { SKIP_PATTERN(2); // for skip ']' in "]:" , pattern_ptr continue, while cmd_ptr remain unchanged - rightFlag++; + brackets--; } else if ((pattern_len > 2) && (pattern_ptr[0] == ']') && (pattern_ptr[1] == '[') && (pattern_ptr[2] == ':')) { SKIP_PATTERN(3); // for skip ']' in "][:" , pattern_ptr continue, while cmd_ptr remain unchanged - leftFlag++; - rightFlag++; + //brackets++; + //brackets--; } else { result = FALSE; break; -- Gitblit v1.9.1