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