FFFTPのソースコードです。
Revision | f1806f8e85068789f78c822f2e1088a12bc09919 (tree) |
---|---|
Time | 2011-10-17 20:52:51 |
Author | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of arbitrary code execution.
@@ -2419,6 +2419,8 @@ void ExecViewer(char *Fname, int App) | ||
2419 | 2419 | char AssocProg[FMAX_PATH+1]; |
2420 | 2420 | char ComLine[FMAX_PATH*2+3+1]; |
2421 | 2421 | char CurDir[FMAX_PATH+1]; |
2422 | + // 任意のコードが実行されるバグ修正 | |
2423 | + char SysDir[FMAX_PATH+1]; | |
2422 | 2424 | |
2423 | 2425 | /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ |
2424 | 2426 | /* 含まれている時、間違ったパス名を返す事がある。 */ |
@@ -2446,10 +2448,26 @@ void ExecViewer(char *Fname, int App) | ||
2446 | 2448 | memset(&Startup, NUL, sizeof(STARTUPINFO)); |
2447 | 2449 | Startup.cb = sizeof(STARTUPINFO); |
2448 | 2450 | Startup.wShowWindow = SW_SHOW; |
2449 | - if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2451 | + // 任意のコードが実行されるバグ修正 | |
2452 | +// if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2453 | +// { | |
2454 | +// SetTaskMsg(MSGJPN182, GetLastError()); | |
2455 | +// SetTaskMsg(">>%s", ComLine); | |
2456 | +// } | |
2457 | + if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0) | |
2450 | 2458 | { |
2451 | - SetTaskMsg(MSGJPN182, GetLastError()); | |
2452 | - SetTaskMsg(">>%s", ComLine); | |
2459 | + if(GetSystemDirectory(SysDir, FMAX_PATH) > 0) | |
2460 | + { | |
2461 | + if(SetCurrentDirectory(SysDir)) | |
2462 | + { | |
2463 | + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2464 | + { | |
2465 | + SetTaskMsg(MSGJPN182, GetLastError()); | |
2466 | + SetTaskMsg(">>%s", ComLine); | |
2467 | + } | |
2468 | + SetCurrentDirectory(CurDir); | |
2469 | + } | |
2470 | + } | |
2453 | 2471 | } |
2454 | 2472 | } |
2455 | 2473 | return; |
@@ -2474,6 +2492,8 @@ void ExecViewer2(char *Fname1, char *Fname2, int App) | ||
2474 | 2492 | char AssocProg[FMAX_PATH+1]; |
2475 | 2493 | char ComLine[FMAX_PATH*2+3+1]; |
2476 | 2494 | char CurDir[FMAX_PATH+1]; |
2495 | + // 任意のコードが実行されるバグ修正 | |
2496 | + char SysDir[FMAX_PATH+1]; | |
2477 | 2497 | |
2478 | 2498 | /* FindExecutable()は関連付けられたプログラムのパス名にスペースが */ |
2479 | 2499 | /* 含まれている時、間違ったパス名を返す事がある。 */ |
@@ -2493,10 +2513,26 @@ void ExecViewer2(char *Fname1, char *Fname2, int App) | ||
2493 | 2513 | memset(&Startup, NUL, sizeof(STARTUPINFO)); |
2494 | 2514 | Startup.cb = sizeof(STARTUPINFO); |
2495 | 2515 | Startup.wShowWindow = SW_SHOW; |
2496 | - if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2516 | + // 任意のコードが実行されるバグ修正 | |
2517 | +// if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2518 | +// { | |
2519 | +// SetTaskMsg(MSGJPN182, GetLastError()); | |
2520 | +// SetTaskMsg(">>%s", ComLine); | |
2521 | +// } | |
2522 | + if(GetCurrentDirectory(FMAX_PATH, CurDir) > 0) | |
2497 | 2523 | { |
2498 | - SetTaskMsg(MSGJPN182, GetLastError()); | |
2499 | - SetTaskMsg(">>%s", ComLine); | |
2524 | + if(GetSystemDirectory(SysDir, FMAX_PATH) > 0) | |
2525 | + { | |
2526 | + if(SetCurrentDirectory(SysDir)) | |
2527 | + { | |
2528 | + if(CreateProcess(NULL, ComLine, NULL, NULL, FALSE, 0, NULL, NULL, &Startup, &Info) == FALSE) | |
2529 | + { | |
2530 | + SetTaskMsg(MSGJPN182, GetLastError()); | |
2531 | + SetTaskMsg(">>%s", ComLine); | |
2532 | + } | |
2533 | + SetCurrentDirectory(CurDir); | |
2534 | + } | |
2535 | + } | |
2500 | 2536 | } |
2501 | 2537 | |
2502 | 2538 | return; |