|
@@ -58,6 +58,7 @@ static int process_script ( struct image *image,
|
58
|
58
|
int ( * terminate ) ( int rc ) ) {
|
59
|
59
|
off_t eol;
|
60
|
60
|
size_t len;
|
|
61
|
+ char *line;
|
61
|
62
|
int rc;
|
62
|
63
|
|
63
|
64
|
script_offset = 0;
|
|
@@ -71,23 +72,23 @@ static int process_script ( struct image *image,
|
71
|
72
|
eol = image->len;
|
72
|
73
|
len = ( eol - script_offset );
|
73
|
74
|
|
74
|
|
- /* Copy line, terminate with NUL, and execute command */
|
75
|
|
- {
|
76
|
|
- char cmdbuf[ len + 1 ];
|
|
75
|
+ /* Allocate buffer for line */
|
|
76
|
+ line = zalloc ( len + 1 /* NUL */ );
|
|
77
|
+ if ( ! line )
|
|
78
|
+ return -ENOMEM;
|
77
|
79
|
|
78
|
|
- copy_from_user ( cmdbuf, image->data,
|
79
|
|
- script_offset, len );
|
80
|
|
- cmdbuf[len] = '\0';
|
81
|
|
- DBG ( "$ %s\n", cmdbuf );
|
|
80
|
+ /* Copy line */
|
|
81
|
+ copy_from_user ( line, image->data, script_offset, len );
|
|
82
|
+ DBG ( "$ %s\n", line );
|
82
|
83
|
|
83
|
|
- /* Move to next line */
|
84
|
|
- script_offset += ( len + 1 );
|
|
84
|
+ /* Move to next line */
|
|
85
|
+ script_offset += ( len + 1 );
|
85
|
86
|
|
86
|
|
- /* Process line */
|
87
|
|
- rc = process_line ( cmdbuf );
|
88
|
|
- if ( terminate ( rc ) )
|
89
|
|
- return rc;
|
90
|
|
- }
|
|
87
|
+ /* Process and free line */
|
|
88
|
+ rc = process_line ( line );
|
|
89
|
+ free ( line );
|
|
90
|
+ if ( terminate ( rc ) )
|
|
91
|
+ return rc;
|
91
|
92
|
|
92
|
93
|
} while ( script_offset < image->len );
|
93
|
94
|
|