diff --git a/src/core/ctype.c b/src/core/ctype.c new file mode 100644 index 00000000..6185bb2f --- /dev/null +++ b/src/core/ctype.c @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2009 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +/** + * @file + * + * Character types + * + */ + +#include + +/** + * Check to see if character is a space + * + * @v c Character + * @ret isspace Character is a space + */ +int isspace ( int c ) { + switch ( c ) { + case ' ' : + case '\f' : + case '\n' : + case '\r' : + case '\t' : + case '\v' : + return 1; + default: + return 0; + } +} diff --git a/src/core/exec.c b/src/core/exec.c index 25c578d5..6c16aa44 100644 --- a/src/core/exec.c +++ b/src/core/exec.c @@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include #include #include #include @@ -170,7 +171,7 @@ static int split_args ( char *args, char * argv[] ) { while ( 1 ) { /* Skip over any whitespace / convert to NUL */ - while ( *args == ' ' ) { + while ( isspace ( *args ) ) { if ( argv ) *args = '\0'; args++; @@ -183,7 +184,7 @@ static int split_args ( char *args, char * argv[] ) { argv[argc] = args; argc++; /* Skip to start of next whitespace, if any */ - while ( *args && ( *args != ' ' ) ) { + while ( *args && ! isspace ( *args ) ) { args++; } } diff --git a/src/core/misc.c b/src/core/misc.c index 5a82c85c..c19591bb 100644 --- a/src/core/misc.c +++ b/src/core/misc.c @@ -5,6 +5,7 @@ MISC Support Routines FILE_LICENCE ( GPL2_OR_LATER ); #include +#include #include #include #include @@ -32,20 +33,6 @@ int inet_aton ( const char *cp, struct in_addr *inp ) { return 0; } -int isspace ( int c ) { - switch ( c ) { - case ' ': - case '\f': - case '\n': - case '\r': - case '\t': - case '\v': - return 1; - default: - return 0; - } -} - unsigned long strtoul ( const char *p, char **endp, int base ) { unsigned long ret = 0; unsigned int charval; diff --git a/src/image/script.c b/src/image/script.c index e94303ab..0835ecb5 100644 --- a/src/image/script.c +++ b/src/image/script.c @@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include +#include #include #include @@ -90,8 +91,8 @@ static int script_exec ( struct image *image ) { * @ret rc Return status code */ static int script_load ( struct image *image ) { - static const char magic[] = "#!gpxe\n"; - char test[ sizeof ( magic ) - 1 ]; + static const char magic[] = "#!gpxe"; + char test[ sizeof ( magic ) - 1 /* NUL */ + 1 /* terminating space */]; /* Sanity check */ if ( image->len < sizeof ( test ) ) { @@ -101,7 +102,8 @@ static int script_load ( struct image *image ) { /* Check for magic signature */ copy_from_user ( test, image->data, 0, sizeof ( test ) ); - if ( memcmp ( test, magic, sizeof ( test ) ) != 0 ) { + if ( ( memcmp ( test, magic, ( sizeof ( test ) - 1 ) ) != 0 ) || + ! isspace ( test[ sizeof ( test ) - 1 ] ) ) { DBG ( "Invalid magic signature\n" ); return -ENOEXEC; } diff --git a/src/include/ctype.h b/src/include/ctype.h index 8a04f47e..ed4d8846 100644 --- a/src/include/ctype.h +++ b/src/include/ctype.h @@ -26,4 +26,6 @@ static inline unsigned char toupper(unsigned char c) return c; } +extern int isspace ( int c ); + #endif /* _CTYPE_H */