This is an automated email from Gerrit.

Jan Matyas ([email protected]) just uploaded a new patch set to Gerrit, which 
you can find at http://openocd.zylin.com/6291

-- gerrit

commit 14ab0163efcb3a49c31c15b580866a225596a9f7
Author: Jan Matyas <[email protected]>
Date:   Fri Jun 4 10:44:44 2021 +0200

    target/semihosting: Fix of close(): Never close standard streams
    
    This change fixes behavior of the SEMIHOSTING_SYS_CLOSE operation.
    It ensures that OpenOCD's own stdin/stdout/stderr streams are never
    closed, not even if the target requests it via semihosting.
    
    Change-Id: Ia85af5963d1a3516284fd834f7197369a8fb268c
    Signed-off-by: Jan Matyas <[email protected]>

diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index 61a69d1..c571fea 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -226,18 +226,28 @@ int semihosting_common(struct target *target)
                                return retval;
                        else {
                                int fd = semihosting_get_field(target, 0, 
fields);
-                               if (semihosting->is_fileio) {
-                                       if (fd == 0 || fd == 1 || fd == 2) {
+                               /* Do not allow to close OpenOCD's own standard 
streams */
+                               if (fd == 0 || fd == 1 || fd == 2) {
+                                       LOG_DEBUG("ignoring semihosting attempt 
to close %s",
+                                                       (fd == 0) ? "stdin" :
+                                                       (fd == 1) ? "stdout" : 
"stderr");
+                                       /* Just pretend success */
+                                       if (semihosting->is_fileio) {
                                                semihosting->result = 0;
-                                               break;
+                                       } else {
+                                               semihosting->result = 0;
+                                               semihosting->sys_errno = 0;
                                        }
+                                       break;
+                               }
+                               /* Close the descriptor */
+                               if (semihosting->is_fileio) {
                                        semihosting->hit_fileio = true;
                                        fileio_info->identifier = "close";
                                        fileio_info->param_1 = fd;
                                } else {
                                        semihosting->result = close(fd);
                                        semihosting->sys_errno = errno;
-
                                        LOG_DEBUG("close(%d)=%d", fd, 
(int)semihosting->result);
                                }
                        }

-- 

Reply via email to