diff options
author | James Buren <braewoods+rb@braewoods.net> | 2021-08-05 13:22:00 +0000 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2021-08-06 03:08:10 +0000 |
commit | da45b37fac6d0d711cdafa0c73eabdc47e8c6a8b (patch) | |
tree | 67304ec7ba9519f9d91366ce23badc6a2491523f | |
parent | a20755e9ef4117e041154f187fade2040a2bd1d6 (diff) | |
download | rockbox-da45b37fac6d0d711cdafa0c73eabdc47e8c6a8b.tar.gz rockbox-da45b37fac6d0d711cdafa0c73eabdc47e8c6a8b.zip |
tools/iriver: fix resource management in encode/decode functions
Change-Id: Ib0b38378c66d5902694d9af9fd0271d616101660
-rw-r--r-- | tools/iriver.c | 89 |
1 files changed, 44 insertions, 45 deletions
diff --git a/tools/iriver.c b/tools/iriver.c index 53e8fbe7a7..dd5d607a89 100644 --- a/tools/iriver.c +++ b/tools/iriver.c | |||
@@ -99,6 +99,7 @@ static FILE * openoutfile( const char * filename ) | |||
99 | int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify, | 99 | int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify, |
100 | enum striptype stripmode ) | 100 | enum striptype stripmode ) |
101 | { | 101 | { |
102 | int rv = 0; | ||
102 | FILE * infile = NULL; | 103 | FILE * infile = NULL; |
103 | FILE * outfile = NULL; | 104 | FILE * outfile = NULL; |
104 | int i = -1; | 105 | int i = -1; |
@@ -110,7 +111,7 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
110 | unsigned char newmunge; | 111 | unsigned char newmunge; |
111 | signed long lenread; | 112 | signed long lenread; |
112 | int s = 0; | 113 | int s = 0; |
113 | unsigned char * pChecksums, * ppChecksums = 0; | 114 | unsigned char * pChecksums = NULL, * ppChecksums = NULL; |
114 | unsigned char ck; | 115 | unsigned char ck; |
115 | 116 | ||
116 | infile = openinfile(infile_name); | 117 | infile = openinfile(infile_name); |
@@ -121,9 +122,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
121 | { | 122 | { |
122 | fprintf( stderr, "This doesn't look like a valid encrypted iHP " | 123 | fprintf( stderr, "This doesn't look like a valid encrypted iHP " |
123 | "firmware - reason: header length\n" ); | 124 | "firmware - reason: header length\n" ); |
124 | fclose(infile); | 125 | rv = -1; |
125 | fclose(outfile); | 126 | goto bail; |
126 | return -1; | ||
127 | }; | 127 | }; |
128 | 128 | ||
129 | i = testheader( headerdata ); | 129 | i = testheader( headerdata ); |
@@ -131,9 +131,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
131 | { | 131 | { |
132 | fprintf( stderr, "This firmware is for an unknown model, or is not" | 132 | fprintf( stderr, "This firmware is for an unknown model, or is not" |
133 | " a valid encrypted iHP firmware\n" ); | 133 | " a valid encrypted iHP firmware\n" ); |
134 | fclose(infile); | 134 | rv = -2; |
135 | fclose(outfile); | 135 | goto bail; |
136 | return -2; | ||
137 | }; | 136 | }; |
138 | fprintf( stderr, "Model %s\n", models[ i ] ); | 137 | fprintf( stderr, "Model %s\n", models[ i ] ); |
139 | 138 | ||
@@ -151,9 +150,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
151 | { | 150 | { |
152 | fprintf( stderr, "This doesn't look like a valid encrypted " | 151 | fprintf( stderr, "This doesn't look like a valid encrypted " |
153 | "iHP firmware - reason: file 'length' data\n" ); | 152 | "iHP firmware - reason: file 'length' data\n" ); |
154 | fclose(infile); | 153 | rv = -3; |
155 | fclose(outfile); | 154 | goto bail; |
156 | return -3; | ||
157 | }; | 155 | }; |
158 | 156 | ||
159 | minsize = firmware_minsize[i]; | 157 | minsize = firmware_minsize[i]; |
@@ -226,18 +224,16 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
226 | { | 224 | { |
227 | fprintf( stderr, "This doesn't look like a valid encrypted " | 225 | fprintf( stderr, "This doesn't look like a valid encrypted " |
228 | "iHP firmware - reason: ESTFBINR 'length' data\n" ); | 226 | "iHP firmware - reason: ESTFBINR 'length' data\n" ); |
229 | fclose(infile); | 227 | rv = -4; |
230 | fclose(outfile); | 228 | goto bail; |
231 | return -4; | ||
232 | }; | 229 | }; |
233 | 230 | ||
234 | if( fp != dwLength2 ) | 231 | if( fp != dwLength2 ) |
235 | { | 232 | { |
236 | fprintf( stderr, "This doesn't look like a valid encrypted " | 233 | fprintf( stderr, "This doesn't look like a valid encrypted " |
237 | "iHP firmware - reason: 'length2' mismatch\n" ); | 234 | "iHP firmware - reason: 'length2' mismatch\n" ); |
238 | fclose(infile); | 235 | rv = -5; |
239 | fclose(outfile); | 236 | goto bail; |
240 | return -5; | ||
241 | }; | 237 | }; |
242 | 238 | ||
243 | fp = 0; | 239 | fp = 0; |
@@ -252,9 +248,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
252 | { | 248 | { |
253 | fprintf( stderr, "This doesn't look like a valid encrypted " | 249 | fprintf( stderr, "This doesn't look like a valid encrypted " |
254 | "iHP firmware - reason: Checksum mismatch!" ); | 250 | "iHP firmware - reason: Checksum mismatch!" ); |
255 | fclose(infile); | 251 | rv = -6; |
256 | fclose(outfile); | 252 | goto bail; |
257 | return -6; | ||
258 | }; | 253 | }; |
259 | ppChecksums += lenread; | 254 | ppChecksums += lenread; |
260 | }; | 255 | }; |
@@ -263,9 +258,8 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
263 | { | 258 | { |
264 | fprintf( stderr, "This doesn't look like a valid encrypted " | 259 | fprintf( stderr, "This doesn't look like a valid encrypted " |
265 | "iHP firmware - reason: 'length3' mismatch\n" ); | 260 | "iHP firmware - reason: 'length3' mismatch\n" ); |
266 | fclose(infile); | 261 | rv = -7; |
267 | fclose(outfile); | 262 | goto bail; |
268 | return -7; | ||
269 | }; | 263 | }; |
270 | 264 | ||
271 | 265 | ||
@@ -287,11 +281,18 @@ int iriver_decode(const char *infile_name, const char *outfile_name, BOOL modify | |||
287 | break; | 281 | break; |
288 | }; | 282 | }; |
289 | 283 | ||
290 | return 0; | 284 | bail: |
285 | if (infile != NULL) | ||
286 | fclose(infile); | ||
287 | if (outfile != NULL) | ||
288 | fclose(outfile); | ||
289 | free(pChecksums); | ||
290 | return rv; | ||
291 | } | 291 | } |
292 | 292 | ||
293 | int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify ) | 293 | int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify ) |
294 | { | 294 | { |
295 | int rv = 0; | ||
295 | FILE * infile = NULL; | 296 | FILE * infile = NULL; |
296 | FILE * outfile = NULL; | 297 | FILE * outfile = NULL; |
297 | int i = -1; | 298 | int i = -1; |
@@ -303,7 +304,7 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
303 | unsigned char newmunge; | 304 | unsigned char newmunge; |
304 | signed long lenread; | 305 | signed long lenread; |
305 | int s = 0; | 306 | int s = 0; |
306 | unsigned char * pChecksums, * ppChecksums; | 307 | unsigned char * pChecksums = NULL, * ppChecksums = NULL; |
307 | unsigned char ck; | 308 | unsigned char ck; |
308 | 309 | ||
309 | infile = openinfile(infile_name); | 310 | infile = openinfile(infile_name); |
@@ -314,9 +315,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
314 | { | 315 | { |
315 | fprintf( stderr, "This doesn't look like a valid decoded " | 316 | fprintf( stderr, "This doesn't look like a valid decoded " |
316 | "iHP firmware - reason: header length\n" ); | 317 | "iHP firmware - reason: header length\n" ); |
317 | fclose(infile); | 318 | rv = -1; |
318 | fclose(outfile); | 319 | goto bail; |
319 | return -1; | ||
320 | }; | 320 | }; |
321 | 321 | ||
322 | if( modify ) | 322 | if( modify ) |
@@ -329,9 +329,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
329 | { | 329 | { |
330 | fprintf( stderr, "This firmware is for an unknown model, or is not" | 330 | fprintf( stderr, "This firmware is for an unknown model, or is not" |
331 | " a valid decoded iHP firmware\n" ); | 331 | " a valid decoded iHP firmware\n" ); |
332 | fclose(infile); | 332 | rv = -2; |
333 | fclose(outfile); | 333 | goto bail; |
334 | return -2; | ||
335 | }; | 334 | }; |
336 | fprintf( stderr, "Model %s\n", models[ i ] ); | 335 | fprintf( stderr, "Model %s\n", models[ i ] ); |
337 | 336 | ||
@@ -348,9 +347,8 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
348 | { | 347 | { |
349 | fprintf( stderr, "This doesn't look like a valid decoded iHP" | 348 | fprintf( stderr, "This doesn't look like a valid decoded iHP" |
350 | " firmware - reason: file 'length' data\n" ); | 349 | " firmware - reason: file 'length' data\n" ); |
351 | fclose(infile); | 350 | rv = -3; |
352 | fclose(outfile); | 351 | goto bail; |
353 | return -3; | ||
354 | }; | 352 | }; |
355 | 353 | ||
356 | minsize = firmware_minsize[i]; | 354 | minsize = firmware_minsize[i]; |
@@ -401,18 +399,16 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
401 | { | 399 | { |
402 | fprintf( stderr, "This doesn't look like a valid decoded iHP" | 400 | fprintf( stderr, "This doesn't look like a valid decoded iHP" |
403 | " firmware - reason: ESTFBINR 'length' data\n" ); | 401 | " firmware - reason: ESTFBINR 'length' data\n" ); |
404 | fclose(infile); | 402 | rv = -4; |
405 | fclose(outfile); | 403 | goto bail; |
406 | return -4; | ||
407 | }; | 404 | }; |
408 | 405 | ||
409 | if( fp != dwLength2 ) | 406 | if( fp != dwLength2 ) |
410 | { | 407 | { |
411 | fprintf( stderr, "This doesn't look like a valid decoded " | 408 | fprintf( stderr, "This doesn't look like a valid decoded " |
412 | "iHP firmware - reason: 'length1' mismatch\n" ); | 409 | "iHP firmware - reason: 'length1' mismatch\n" ); |
413 | fclose(infile); | 410 | rv = -5; |
414 | fclose(outfile); | 411 | goto bail; |
415 | return -5; | ||
416 | }; | 412 | }; |
417 | 413 | ||
418 | /* write out remainder w/out applying descrambler */ | 414 | /* write out remainder w/out applying descrambler */ |
@@ -431,14 +427,17 @@ int iriver_encode(const char *infile_name, const char *outfile_name, BOOL modify | |||
431 | { | 427 | { |
432 | fprintf( stderr, "This doesn't look like a valid decoded " | 428 | fprintf( stderr, "This doesn't look like a valid decoded " |
433 | "iHP firmware - reason: 'length2' mismatch\n" ); | 429 | "iHP firmware - reason: 'length2' mismatch\n" ); |
434 | fclose(infile); | 430 | rv = -6; |
435 | fclose(outfile); | 431 | goto bail; |
436 | return -6; | ||
437 | }; | 432 | }; |
438 | 433 | ||
439 | fprintf( stderr, "File encoded successfully and checksum table built!\n" ); | 434 | fprintf( stderr, "File encoded successfully and checksum table built!\n" ); |
440 | 435 | ||
441 | fclose(infile); | 436 | bail: |
442 | fclose(outfile); | 437 | if (infile != NULL) |
443 | return 0; | 438 | fclose(infile); |
439 | if (outfile != NULL) | ||
440 | fclose(outfile); | ||
441 | free(pChecksums); | ||
442 | return rv; | ||
444 | } | 443 | } |