From d44ab5893845801ec95e058b9b56a3a75b9720f7 Mon Sep 17 00:00:00 2001
From: Jan Breuer <jan.breuer@jaybee.cz>
Date: 周日, 04 10月 2015 19:35:26 +0800
Subject: [PATCH] Fix access outside buffer

---
 libscpi/src/error.c |   37 +++++++++++++++++++++++++++++++++----
 1 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/libscpi/src/error.c b/libscpi/src/error.c
index d856db3..34735d2 100644
--- a/libscpi/src/error.c
+++ b/libscpi/src/error.c
@@ -61,6 +61,33 @@
 }
 
 /**
+ * Emit no error
+ * @param context scpi context
+ */
+static void SCPI_ErrorEmitEmpty(scpi_t * context) {
+    if ((SCPI_ErrorCount(context) == 0) && (SCPI_RegGet(context, SCPI_REG_STB) & STB_QMA)) {
+        SCPI_RegClearBits(context, SCPI_REG_STB, STB_QMA);
+
+        if (context->interface && context->interface->error) {
+            context->interface->error(context, 0);
+        }
+    }
+}
+
+/**
+ * Emit error
+ * @param context scpi context
+ * @param err Error to emit
+ */
+static void SCPI_ErrorEmit(scpi_t * context, int16_t err) {
+    SCPI_RegSetBits(context, SCPI_REG_STB, STB_QMA);
+
+    if (context->interface && context->interface->error) {
+        context->interface->error(context, err);
+    }
+}
+
+/**
  * Clear error queue
  * @param context - scpi context
  */
@@ -72,6 +99,8 @@
 
     /* basic FIFO */
     fifo_clear((scpi_fifo_t *)context->error_queue);
+
+    SCPI_ErrorEmitEmpty(context);
 }
 
 /**
@@ -91,6 +120,8 @@
 
     /* basic FIFO */
     fifo_remove((scpi_fifo_t *)context->error_queue, &result);
+
+    SCPI_ErrorEmitEmpty(context);
 
     return result;
 }
@@ -161,11 +192,9 @@
         }
     }
 
-    if (context) {
-        if (context->interface && context->interface->error) {
-            context->interface->error(context, err);
-        }
+    SCPI_ErrorEmit(context, err);
 
+    if (context) {
         context->cmd_error = TRUE;
     }
 }

--
Gitblit v1.9.1