mirror of
https://github.com/tbamud/tbamud.git
synced 2026-04-30 04:41:51 +02:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 80b77808f3 | |||
| c5bed0e141 |
+13
-14
@@ -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';
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-30
@@ -41,7 +41,7 @@
|
|||||||
/* local (file scope) functions */
|
/* local (file scope) functions */
|
||||||
static int perform_dupe_check(struct descriptor_data *d);
|
static int perform_dupe_check(struct descriptor_data *d);
|
||||||
static struct alias_data *find_alias(struct alias_data *alias_list, char *str);
|
static struct alias_data *find_alias(struct alias_data *alias_list, char *str);
|
||||||
static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alias_data *a, struct char_data *ch);
|
static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alias_data *a);
|
||||||
static int _parse_name(char *arg, char *name);
|
static int _parse_name(char *arg, char *name);
|
||||||
static bool perform_new_char_dupe_check(struct descriptor_data *d);
|
static bool perform_new_char_dupe_check(struct descriptor_data *d);
|
||||||
/* sort_commands utility */
|
/* sort_commands utility */
|
||||||
@@ -668,10 +668,9 @@ ACMD(do_alias)
|
|||||||
* commands. */
|
* commands. */
|
||||||
#define NUM_TOKENS 9
|
#define NUM_TOKENS 9
|
||||||
|
|
||||||
static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alias_data *a, struct char_data *ch)
|
static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alias_data *a)
|
||||||
{
|
{
|
||||||
struct txt_q temp_queue;
|
struct txt_q temp_queue;
|
||||||
struct txt_block *qtmp;
|
|
||||||
char *tokens[NUM_TOKENS], *temp, *write_point;
|
char *tokens[NUM_TOKENS], *temp, *write_point;
|
||||||
char buf2[MAX_RAW_INPUT_LENGTH], buf[MAX_RAW_INPUT_LENGTH]; /* raw? */
|
char buf2[MAX_RAW_INPUT_LENGTH], buf[MAX_RAW_INPUT_LENGTH]; /* raw? */
|
||||||
int num_of_tokens = 0, num;
|
int num_of_tokens = 0, num;
|
||||||
@@ -698,27 +697,16 @@ static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alia
|
|||||||
} else if (*temp == ALIAS_VAR_CHAR) {
|
} else if (*temp == ALIAS_VAR_CHAR) {
|
||||||
temp++;
|
temp++;
|
||||||
if ((num = *temp - '1') < num_of_tokens && num >= 0) {
|
if ((num = *temp - '1') < num_of_tokens && num >= 0) {
|
||||||
if ((write_point - buf) + strlen(tokens[num]) >= MAX_RAW_INPUT_LENGTH)
|
strcpy(write_point, tokens[num]); /* strcpy: OK */
|
||||||
goto overflow;
|
|
||||||
strcpy(write_point, tokens[num]);
|
|
||||||
write_point += strlen(tokens[num]);
|
write_point += strlen(tokens[num]);
|
||||||
} else if (*temp == ALIAS_GLOB_CHAR) {
|
} else if (*temp == ALIAS_GLOB_CHAR) {
|
||||||
skip_spaces(&orig);
|
skip_spaces(&orig);
|
||||||
if ((write_point - buf) + strlen(orig) >= MAX_RAW_INPUT_LENGTH)
|
strcpy(write_point, orig); /* strcpy: OK */
|
||||||
goto overflow;
|
|
||||||
strcpy(write_point, orig);
|
|
||||||
write_point += strlen(orig);
|
write_point += strlen(orig);
|
||||||
} else {
|
} else if ((*(write_point++) = *temp) == '$') /* redouble $ for act safety */
|
||||||
if (write_point - buf + 2 >= MAX_RAW_INPUT_LENGTH)
|
*(write_point++) = '$';
|
||||||
goto overflow;
|
} else
|
||||||
if ((*(write_point++) = *temp) == '$') /* redouble $ for act safety */
|
|
||||||
*(write_point++) = '$';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (write_point - buf + 1 >= MAX_RAW_INPUT_LENGTH)
|
|
||||||
goto overflow;
|
|
||||||
*(write_point++) = *temp;
|
*(write_point++) = *temp;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*write_point = '\0';
|
*write_point = '\0';
|
||||||
@@ -732,16 +720,6 @@ static void perform_complex_alias(struct txt_q *input_q, char *orig, struct alia
|
|||||||
temp_queue.tail->next = input_q->head;
|
temp_queue.tail->next = input_q->head;
|
||||||
input_q->head = temp_queue.head;
|
input_q->head = temp_queue.head;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
|
|
||||||
overflow:
|
|
||||||
send_to_char(ch, "Alias expansion too long.\r\n");
|
|
||||||
while (temp_queue.head) {
|
|
||||||
qtmp = temp_queue.head;
|
|
||||||
temp_queue.head = qtmp->next;
|
|
||||||
free(qtmp->text);
|
|
||||||
free(qtmp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given a character and a string, perform alias replacement on it.
|
/* Given a character and a string, perform alias replacement on it.
|
||||||
@@ -777,7 +755,7 @@ int perform_alias(struct descriptor_data *d, char *orig, size_t maxlen)
|
|||||||
strlcpy(orig, a->replacement, maxlen);
|
strlcpy(orig, a->replacement, maxlen);
|
||||||
return (0);
|
return (0);
|
||||||
} else {
|
} else {
|
||||||
perform_complex_alias(&d->input, ptr, a, d->character);
|
perform_complex_alias(&d->input, ptr, a);
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user