[flashrom] [PATCH] serprog: flush stream in sp_docommand

Urja Rannikko urjaman at gmail.com
Mon Oct 14 16:26:57 CEST 2013


This is to prevent bugs in the future - currently sp_docommand
is not called with operations in flight, but this makes it safe.

Signed-off-by: Urja Rannikko <urjaman at gmail.com>
-----
The patch also moves sp_flush_stream above sp_docommand...

---
 serprog.c | 51 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 28 insertions(+), 23 deletions(-)

diff --git a/serprog.c b/serprog.c
index d7483cf..03963ec 100644
--- a/serprog.c
+++ b/serprog.c
@@ -204,12 +204,40 @@ static int sp_automatic_cmdcheck(uint8_t cmd)
 	return 0;
 }
 
+static int sp_flush_stream(void)
+{
+	if (sp_streamed_transmit_ops)
+		do {
+			unsigned char c;
+			if (serialport_read(&c, 1) != 0) {
+				msg_perr("Error: cannot read from device (flushing stream)");
+				return 1;
+			}
+			if (c == S_NAK) {
+				msg_perr("Error: NAK to a stream buffer operation\n");
+				return 1;
+			}
+			if (c != S_ACK) {
+				msg_perr("Error: Invalid reply 0x%02X from device\n", c);
+				return 1;
+			}
+		} while (--sp_streamed_transmit_ops);
+	sp_streamed_transmit_ops = 0;
+	sp_streamed_transmit_bytes = 0;
+	return 0;
+}
+
 static int sp_docommand(uint8_t command, uint32_t parmlen,
 			uint8_t *params, uint32_t retlen, void *retparms)
 {
 	unsigned char c;
 	if (sp_automatic_cmdcheck(command))
 		return 1;
+
+	if (sp_flush_stream() != 0) {
+		return 1;
+	}
+
 	if (serialport_write(&command, 1) != 0) {
 		msg_perr("Error: cannot write op code: %s\n", strerror(errno));
 		return 1;
@@ -237,29 +265,6 @@ static int sp_docommand(uint8_t command, uint32_t parmlen,
 	return 0;
 }
 
-static int sp_flush_stream(void)
-{
-	if (sp_streamed_transmit_ops)
-		do {
-			unsigned char c;
-			if (serialport_read(&c, 1) != 0) {
-				msg_perr("Error: cannot read from device (flushing stream)");
-				return 1;
-			}
-			if (c == S_NAK) {
-				msg_perr("Error: NAK to a stream buffer operation\n");
-				return 1;
-			}
-			if (c != S_ACK) {
-				msg_perr("Error: Invalid reply 0x%02X from device\n", c);
-				return 1;
-			}
-		} while (--sp_streamed_transmit_ops);
-	sp_streamed_transmit_ops = 0;
-	sp_streamed_transmit_bytes = 0;
-	return 0;
-}
-
 static int sp_stream_buffer_op(uint8_t cmd, uint32_t parmlen, uint8_t *parms)
 {
 	uint8_t *sp;
-- 
1.8.4





More information about the flashrom mailing list