mirror of https://github.com/ipxe/ipxe.git
[script] Remove arbitrary limit on script line lengths
parent
0d91c37ce5
commit
0ea821c7b7
|
@ -210,6 +210,23 @@ strlen_user ( userptr_t buffer, off_t offset ) {
|
||||||
return strlen ( ( void * ) buffer + offset );
|
return strlen ( ( void * ) buffer + offset );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find character in user buffer
|
||||||
|
*
|
||||||
|
* @v buffer User buffer
|
||||||
|
* @v offset Starting offset within buffer
|
||||||
|
* @v c Character to search for
|
||||||
|
* @v len Length of user buffer
|
||||||
|
* @ret offset Offset of character, or <0 if not found
|
||||||
|
*/
|
||||||
|
static inline __attribute__ (( always_inline )) off_t
|
||||||
|
memchr_user ( userptr_t buffer, off_t offset, int c, size_t len ) {
|
||||||
|
void *found;
|
||||||
|
|
||||||
|
found = memchr ( ( ( void * ) buffer + offset ), c, len );
|
||||||
|
return ( found ? ( found - ( void * ) buffer ) : -1 );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert virtual address to user buffer
|
* Convert virtual address to user buffer
|
||||||
*
|
*
|
||||||
|
|
|
@ -37,11 +37,9 @@ struct image_type script_image_type __image_type ( PROBE_NORMAL );
|
||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
static int script_exec ( struct image *image ) {
|
static int script_exec ( struct image *image ) {
|
||||||
char cmdbuf[256];
|
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
size_t remaining;
|
off_t eol;
|
||||||
size_t len;
|
size_t len;
|
||||||
char *eol;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Temporarily de-register image, so that a "boot" command
|
/* Temporarily de-register image, so that a "boot" command
|
||||||
|
@ -53,36 +51,29 @@ static int script_exec ( struct image *image ) {
|
||||||
|
|
||||||
while ( offset < image->len ) {
|
while ( offset < image->len ) {
|
||||||
|
|
||||||
/* Read up to cmdbuf bytes from script into buffer */
|
/* Find length of next line, excluding any terminating '\n' */
|
||||||
remaining = ( image->len - offset );
|
eol = memchr_user ( image->data, offset, '\n',
|
||||||
len = sizeof ( cmdbuf );
|
( image->len - offset ) );
|
||||||
if ( len > remaining )
|
if ( eol < 0 )
|
||||||
len = remaining;
|
eol = image->len;
|
||||||
memset ( cmdbuf, 0, sizeof ( cmdbuf ) );
|
len = ( eol - offset );
|
||||||
copy_from_user ( cmdbuf, image->data, offset, len );
|
|
||||||
|
|
||||||
/* Find end of line */
|
/* Copy line, terminate with NUL, and execute command */
|
||||||
eol = memchr ( cmdbuf, '\n', sizeof ( cmdbuf ) );
|
{
|
||||||
if ( ! eol )
|
char cmdbuf[ len + 1 ];
|
||||||
eol = memchr ( cmdbuf, '\0', sizeof ( cmdbuf ) );
|
|
||||||
if ( ! eol ) {
|
|
||||||
DBG ( "Script line too long (max %zd bytes)\n",
|
|
||||||
sizeof ( cmdbuf ) );
|
|
||||||
rc = -ENOEXEC;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Mark end of line and execute command */
|
copy_from_user ( cmdbuf, image->data, offset, len );
|
||||||
*eol = '\0';
|
cmdbuf[len] = '\0';
|
||||||
DBG ( "$ %s\n", cmdbuf );
|
DBG ( "$ %s\n", cmdbuf );
|
||||||
if ( ( rc = system ( cmdbuf ) ) != 0 ) {
|
if ( ( rc = system ( cmdbuf ) ) != 0 ) {
|
||||||
DBG ( "Command \"%s\" failed: %s\n",
|
DBG ( "Command \"%s\" failed: %s\n",
|
||||||
cmdbuf, strerror ( rc ) );
|
cmdbuf, strerror ( rc ) );
|
||||||
goto done;
|
goto done;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to next line */
|
/* Move to next line */
|
||||||
offset += ( ( eol - cmdbuf ) + 1 );
|
offset += ( len + 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
Loading…
Reference in New Issue