← Commit list

25d9b91d9

Denys Vlasenko
Denys Vlasenko
2010-01-13
FAILED Duration: 27s

Subject

shell/read: check that variable names are sane

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash.c+0 -4
@@ -1768,11 +1768,7 @@ static const struct {
const char *text;
void (*func)(const char *) FAST_FUNC;
} varinit_data[] = {
-#if IFS_BROKEN
{ VSTRFIXED|VTEXTFIXED , defifsvar , NULL },
-#else
- { VSTRFIXED|VTEXTFIXED|VUNSET, "IFS\0" , NULL },
-#endif
#if ENABLE_ASH_MAIL
{ VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL\0" , changemail },
{ VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH\0", changemail },
shell/builtin_read.c+11 -0
@@ -39,6 +39,7 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
unsigned end_ms; /* -t TIMEOUT */
int fd; /* -u FD */
int nchars; /* -n NUM */
+ char **pp;
char *buffer;
struct termios tty, old_tty;
const char *retval;
@@ -46,6 +47,16 @@ shell_builtin_read(void FAST_FUNC (*setvar)(const char *name, const char *val),
int startword;
smallint backslash;
+ pp = argv;
+ while (*pp) {
+ if (!is_well_formed_var_name(*pp, '\0')) {
+ /* Mimic bash message */
+ bb_error_msg("read: '%s': not a valid identifier", *pp);
+ return (const char *)(uintptr_t)1;
+ }
+ pp++;
+ }
+
nchars = 0; /* if != 0, -n is in effect */
if (opt_n) {
nchars = bb_strtou(opt_n, NULL, 10);
shell/hush.c+0 -10
@@ -893,16 +893,6 @@ static void cmdedit_update_prompt(void);
/* Utility functions
*/
-static int is_well_formed_var_name(const char *s, char terminator)
-{
- if (!s || !(isalpha(*s) || *s == '_'))
- return 0;
- s++;
- while (isalnum(*s) || *s == '_')
- s++;
- return *s == terminator;
-}
-
/* Replace each \x with x in place, return ptr past NUL. */
static char *unbackslash(char *src)
{
shell/shell_common.c+13 -4
@@ -19,8 +19,17 @@
#include "libbb.h"
#include "shell_common.h"
-#if IFS_BROKEN
const char defifsvar[] ALIGN1 = "IFS= \t\n";
-#else
-const char defifs[] ALIGN1 = " \t\n";
-#endif
+
+
+int FAST_FUNC is_well_formed_var_name(const char *s, char terminator)
+{
+ if (!s || !(isalpha(*s) || *s == '_'))
+ return 0;
+
+ do
+ s++;
+ while (isalnum(*s) || *s == '_');
+
+ return *s == terminator;
+}
shell/shell_common.h+2 -6
@@ -21,14 +21,10 @@
PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
-#define IFS_BROKEN 1
-
-#if IFS_BROKEN
extern const char defifsvar[]; /* "IFS= \t\n" */
#define defifs (defifsvar + 4)
-#else
-extern const char defifs[]; /* " \t\n" */
-#endif
+
+int FAST_FUNC is_well_formed_var_name(const char *s, char terminator);
POP_SAVED_FUNCTION_VISIBILITY