|
@@ -57,9 +57,11 @@ static size_t script_offset;
|
57
|
57
|
static int process_script ( struct image *image,
|
58
|
58
|
int ( * process_line ) ( const char *line ),
|
59
|
59
|
int ( * terminate ) ( int rc ) ) {
|
|
60
|
+ size_t len = 0;
|
|
61
|
+ char *line = NULL;
|
60
|
62
|
off_t eol;
|
61
|
|
- size_t len;
|
62
|
|
- char *line;
|
|
63
|
+ size_t frag_len;
|
|
64
|
+ char *tmp;
|
63
|
65
|
int rc;
|
64
|
66
|
|
65
|
67
|
script_offset = 0;
|
|
@@ -71,28 +73,54 @@ static int process_script ( struct image *image,
|
71
|
73
|
( image->len - script_offset ) );
|
72
|
74
|
if ( eol < 0 )
|
73
|
75
|
eol = image->len;
|
74
|
|
- len = ( eol - script_offset );
|
|
76
|
+ frag_len = ( eol - script_offset );
|
75
|
77
|
|
76
|
78
|
/* Allocate buffer for line */
|
77
|
|
- line = zalloc ( len + 1 /* NUL */ );
|
78
|
|
- if ( ! line )
|
79
|
|
- return -ENOMEM;
|
|
79
|
+ tmp = realloc ( line, ( len + frag_len + 1 /* NUL */ ) );
|
|
80
|
+ if ( ! tmp ) {
|
|
81
|
+ rc = -ENOMEM;
|
|
82
|
+ goto err_alloc;
|
|
83
|
+ }
|
|
84
|
+ line = tmp;
|
80
|
85
|
|
81
|
86
|
/* Copy line */
|
82
|
|
- copy_from_user ( line, image->data, script_offset, len );
|
|
87
|
+ copy_from_user ( ( line + len ), image->data, script_offset,
|
|
88
|
+ frag_len );
|
|
89
|
+ len += frag_len;
|
|
90
|
+
|
|
91
|
+ /* Move to next line in script */
|
|
92
|
+ script_offset += ( frag_len + 1 );
|
|
93
|
+
|
|
94
|
+ /* Strip trailing CR, if present */
|
|
95
|
+ if ( line[ len - 1 ] == '\r' )
|
|
96
|
+ len--;
|
|
97
|
+
|
|
98
|
+ /* Handle backslash continuations */
|
|
99
|
+ if ( line[ len - 1 ] == '\\' ) {
|
|
100
|
+ len--;
|
|
101
|
+ rc = -EINVAL;
|
|
102
|
+ continue;
|
|
103
|
+ }
|
|
104
|
+
|
|
105
|
+ /* Terminate line */
|
|
106
|
+ line[len] = '\0';
|
83
|
107
|
DBG ( "$ %s\n", line );
|
84
|
108
|
|
85
|
|
- /* Move to next line */
|
86
|
|
- script_offset += ( len + 1 );
|
87
|
|
-
|
88
|
|
- /* Process and free line */
|
|
109
|
+ /* Process line */
|
89
|
110
|
rc = process_line ( line );
|
90
|
|
- free ( line );
|
91
|
111
|
if ( terminate ( rc ) )
|
92
|
|
- return rc;
|
|
112
|
+ goto err_process;
|
|
113
|
+
|
|
114
|
+ /* Free line */
|
|
115
|
+ free ( line );
|
|
116
|
+ line = NULL;
|
|
117
|
+ len = 0;
|
93
|
118
|
|
94
|
119
|
} while ( script_offset < image->len );
|
95
|
120
|
|
|
121
|
+ err_process:
|
|
122
|
+ err_alloc:
|
|
123
|
+ free ( line );
|
96
|
124
|
return rc;
|
97
|
125
|
}
|
98
|
126
|
|