Browse code

Fix crashing if a file no longer exists when Winamp tries to access it.

Naram Qashat authored on 2013/04/07 16:38:28
Showing 1 changed files
... ...
@@ -101,7 +101,18 @@ void getFileInfo(const in_char *file, in_char *title, int *length_in_ms)
101 101
 		xSF = xSFFile;
102 102
 	else
103 103
 	{
104
-		xSF = new XSFFile(file);
104
+		try
105
+		{
106
+			xSF = new XSFFile(file);
107
+		}
108
+		catch (const std::exception &)
109
+		{
110
+			if (title)
111
+				String("").CopyToString(title);
112
+			if (length_in_ms)
113
+				*length_in_ms = -1000;
114
+			return;
115
+		}
105 116
 		toFree = true;
106 117
 	}
107 118
 	if (title)
... ...
@@ -309,23 +320,30 @@ extern "C" __declspec(dllexport) int winampGetExtendedFileInfo(const char *fn, c
309 320
 	}
310 321
 	else
311 322
 	{
312
-		XSFFile file = XSFFile(fn);
313
-		std::string tagToGet = data;
314
-		if (eqstr(data, "album"))
315
-			tagToGet = "game";
316
-		if (!file.GetTagExists(tagToGet))
323
+		try
317 324
 		{
318
-			if (eqstr(tagToGet, "replaygain_track_gain"))
325
+			XSFFile file = XSFFile(fn);
326
+			std::string tagToGet = data;
327
+			if (eqstr(data, "album"))
328
+				tagToGet = "game";
329
+			if (!file.GetTagExists(tagToGet))
330
+			{
331
+				if (eqstr(tagToGet, "replaygain_track_gain"))
332
+					return 1;
333
+				return 0;
334
+			}
335
+			else if (eqstr(tagToGet, "length"))
336
+			{
337
+				strcpy(dest, stringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
319 338
 				return 1;
320
-			return 0;
339
+			}
340
+			file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest, true);
341
+			return 1;
321 342
 		}
322
-		else if (eqstr(tagToGet, "length"))
343
+		catch (const std::exception &)
323 344
 		{
324
-			strcpy(dest, stringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
325
-			return 1;
345
+			return 0;
326 346
 		}
327
-		file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest, true);
328
-		return 1;
329 347
 	}
330 348
 }
331 349
 
... ...
@@ -343,23 +361,30 @@ extern "C" __declspec(dllexport) int winampGetExtendedFileInfoW(const wchar_t *f
343 361
 	}
344 362
 	else
345 363
 	{
346
-		XSFFile file = XSFFile(fn);
347
-		std::string tagToGet = data;
348
-		if (eqstr(data, "album"))
349
-			tagToGet = "game";
350
-		if (!file.GetTagExists(tagToGet))
364
+		try
351 365
 		{
352
-			if (eqstr(tagToGet, "replaygain_track_gain"))
366
+			XSFFile file = XSFFile(fn);
367
+			std::string tagToGet = data;
368
+			if (eqstr(data, "album"))
369
+				tagToGet = "game";
370
+			if (!file.GetTagExists(tagToGet))
371
+			{
372
+				if (eqstr(tagToGet, "replaygain_track_gain"))
373
+					return 1;
374
+				return 0;
375
+			}
376
+			else if (eqstr(tagToGet, "length"))
377
+			{
378
+				wcscpy(dest, wstringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
353 379
 				return 1;
354
-			return 0;
380
+			}
381
+			file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest);
382
+			return 1;
355 383
 		}
356
-		else if (eqstr(tagToGet, "length"))
384
+		catch (const std::exception &)
357 385
 		{
358
-			wcscpy(dest, wstringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
359
-			return 1;
386
+			return 0;
360 387
 		}
361
-		file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest);
362
-		return 1;
363 388
 	}
364 389
 }
365 390
 
... ...
@@ -373,16 +398,30 @@ int wrapperWinampSetExtendedFileInfo(const char *data, const wchar_t *val)
373 398
 
374 399
 extern "C" __declspec(dllexport) int winampSetExtendedFileInfo(const char *fn, const char *data, const wchar_t *val)
375 400
 {
376
-	if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetStr() != fn)
377
-		extendedXSFFile.reset(new XSFFile(fn));
378
-	return wrapperWinampSetExtendedFileInfo(data, val);
401
+	try
402
+	{
403
+		if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetStr() != fn)
404
+			extendedXSFFile.reset(new XSFFile(fn));
405
+		return wrapperWinampSetExtendedFileInfo(data, val);
406
+	}
407
+	catch (const std::exception &)
408
+	{
409
+		return 0;
410
+	}
379 411
 }
380 412
 
381 413
 extern "C" __declspec(dllexport) int winampSetExtendedFileInfoW(const wchar_t *fn, const char *data, const wchar_t *val)
382 414
 {
383
-	if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetWStr() != fn)
384
-		extendedXSFFile.reset(new XSFFile(fn));
385
-	return wrapperWinampSetExtendedFileInfo(data, val);
415
+	try
416
+	{
417
+		if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetWStr() != fn)
418
+			extendedXSFFile.reset(new XSFFile(fn));
419
+		return wrapperWinampSetExtendedFileInfo(data, val);
420
+	}
421
+	catch (const std::exception &)
422
+	{
423
+		return 0;
424
+	}
386 425
 }
387 426
 
388 427
 extern "C" __declspec(dllexport) int winampWriteExtendedFileInfo()
... ...
@@ -418,14 +457,28 @@ intptr_t wrapperWinampGetExtendedRead_open(std::unique_ptr<XSFPlayer> tmpxSFPlay
418 457
 
419 458
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_open(const char *fn, int *size, int *bps, int *nch, int *srate)
420 459
 {
421
-	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
422
-	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
460
+	try
461
+	{
462
+		auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
463
+		return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
464
+	}
465
+	catch (const std::exception &)
466
+	{
467
+		return 0;
468
+	}
423 469
 }
424 470
 
425 471
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_openW(const wchar_t *fn, int *size, int *bps, int *nch, int *srate)
426 472
 {
427
-	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
428
-	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
473
+	try
474
+	{
475
+		auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
476
+		return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
477
+	}
478
+	catch (const std::exception &)
479
+	{
480
+		return 0;
481
+	}
429 482
 }
430 483
 
431 484
 int extendedSeekNeeded = -1;