From dcc4b13d0b29afb0cdf63168e58fdf765f2ab649 Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Mon, 30 Nov 2020 17:09:21 -0800
Subject: [PATCH] A second pass at: Better native vs. DOS cmd-line detection in
 cmdstr()

cmdstr() is often called for non-executable command-lines (e.g. for @include: file name/path arguments), so don't default to native unless a mode value was specified. Hopefully addresses issue reported by bobrob without breaking anything else (again).
---
 src/sbbs3/xtrn.cpp | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index fb31c73df4..10dca2e685 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -226,7 +226,10 @@ static bool native_executable(scfg_t* cfg, const char* cmdline, long mode)
 	unsigned i;
 
 	if(mode&EX_NATIVE)
-		return(TRUE);
+		return true;
+
+	if(*cmdline == '?' || *cmdline == '*')
+		return true;
 
     SAFECOPY(str,cmdline);				/* Set str to program name only */
 	truncstr(str," ");
@@ -1838,9 +1841,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 {
 	char	str[MAX_PATH+1],*cmd;
     int		i,j,len;
-
-	if(mode == EX_UNSPECIFIED && (*instr == '?' || *instr == '*'))
-		mode = EX_NATIVE;
+	bool	native = (mode == EX_UNSPECIFIED) || native_executable(&cfg, instr, mode);
 
     if(outstr==NULL)
         cmd=cmdstr_output;
@@ -1874,8 +1875,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'F':   /* File path */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE)
-						&& strncmp(fpath, cfg.node_dir, strlen(cfg.node_dir)) == 0) {
+					if(!native && strncmp(fpath, cfg.node_dir, strlen(cfg.node_dir)) == 0) {
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 						strncat(cmd, fpath + strlen(cfg.node_dir), avail);
 					}
@@ -1885,7 +1885,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'G':   /* Temp directory */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_TEMP_DIR, avail);
 					else
 #endif
@@ -1899,7 +1899,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'J':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_DATA_DIR, avail);
 					else
 #endif
@@ -1907,7 +1907,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'K':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_CTRL_DIR, avail);
 					else
 #endif
@@ -1921,7 +1921,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'N':   /* Node Directory (same as SBBSNODE environment var) */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_NODE_DIR, avail);
 					else
 #endif
@@ -1966,7 +1966,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
                     break;
                 case 'Z':
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_TEXT_DIR, avail);
 					else
 #endif
@@ -1984,7 +1984,7 @@ char* sbbs_t::cmdstr(const char *instr, const char *fpath, const char *fspec, ch
 					break;
                 case '!':   /* EXEC Directory */
 #if defined(__linux__) && defined(USE_DOSEMU)
-					if(!(mode & EX_NATIVE))
+					if(!native)
 						strncat(cmd, DOSEMU_EXEC_DIR, avail);
 					else
 #endif
-- 
GitLab