2 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] 80b77808f3 Fix OS command injection in fix_filename() - use allowlist for safe chars
Agent-Logs-Url: https://github.com/tbamud/tbamud/sessions/a9e10199-b353-440a-ba26-279f0d0e42bf

Co-authored-by: welcor <357770+welcor@users.noreply.github.com>
2026-04-24 10:22:33 +00:00
copilot-swe-agent[bot] c5bed0e141 Initial plan 2026-04-24 10:16:38 +00:00
2 changed files with 14 additions and 22 deletions
-7
View File
@@ -1636,13 +1636,6 @@ void var_subst(void *go, struct script_data *sc, trig_data *trig,
int paren_count = 0; int paren_count = 0;
int dots = 0; int dots = 0;
/* reject lines that would overflow our fixed-size buffers */
if (strnlen(line, MAX_INPUT_LENGTH) >= MAX_INPUT_LENGTH) {
script_log("Trigger VNum %d: variable substitution line too long, ignoring.", GET_TRIG_VNUM(trig));
*buf = '\0';
return;
}
/* skip out if no %'s */ /* skip out if no %'s */
if (!strchr(line, '%')) { if (!strchr(line, '%')) {
strcpy(buf, line); strcpy(buf, line);
+13 -14
View File
@@ -277,7 +277,10 @@ int sprintascii(char *out, bitvector_t bits)
return j; return j;
} }
/* converts illegal filename chars into appropriate equivalents */ /* converts illegal filename chars into appropriate equivalents.
* Uses an allowlist: alphanumerics, underscore, hyphen, and dot are kept;
* spaces are converted to underscores; all other characters (including shell
* metacharacters such as ; | & ` $ > < \n) are silently dropped. */
static void fix_filename(const char *str, char *outbuf, size_t maxlen) static void fix_filename(const char *str, char *outbuf, size_t maxlen)
{ {
const char *in = str; const char *in = str;
@@ -285,21 +288,17 @@ static void fix_filename(const char *str, char *outbuf, size_t maxlen)
int count = 0; int count = 0;
while (*in) { while (*in) {
switch(*in) { if (isalnum((unsigned char)*in) || *in == '_' || *in == '-' || *in == '.') {
case ' ': *out = '_'; out++; break; /* Safe characters kept as-is */
case '(': *out = '{'; out++; break; *out++ = *in;
case ')': *out = '}'; out++; break; if (++count == maxlen - 1) break;
} else if (*in == ' ') {
/* skip the following */ /* Spaces become underscores */
case '\'': break; *out++ = '_';
case '"': break; if (++count == maxlen - 1) break;
/* Legal character */
default: *out = *in; out++;break;
} }
/* All other characters, including shell metacharacters, are dropped */
in++; in++;
count++;
if (count == maxlen - 1) break;
} }
*out = '\0'; *out = '\0';
} }