FFFTPのソースコードです。
Revisão | 7677acb145ecb0ef18f09f561740f08841f36f62 (tree) |
---|---|
Hora | 2011-11-04 20:13:10 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of character code conversion of filenames.
Enhance routines for canceling or aborting.
@@ -4830,11 +4830,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, | ||
4830 | 4830 | |
4831 | 4831 | if(strchr("dl", *Str) != NULL) |
4832 | 4832 | { |
4833 | - if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) || | |
4834 | - (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0)) | |
4835 | - { | |
4836 | - *(Fname + strlen(Fname) - 1) = NUL; | |
4837 | - } | |
4833 | + // 0x5Cが含まれる文字列を扱えないバグ修正 | |
4834 | +// if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) || | |
4835 | +// (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0)) | |
4836 | +// { | |
4837 | +// *(Fname + strlen(Fname) - 1) = NUL; | |
4838 | +// } | |
4838 | 4839 | Ret = NODE_DIR; |
4839 | 4840 | if(*Str == 'l') |
4840 | 4841 | *Link = YES; |
@@ -4904,6 +4905,10 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, | ||
4904 | 4905 | Ret = NODE_NONE; |
4905 | 4906 | else |
4906 | 4907 | ChangeFnameRemote2Local(Fname, FMAX_PATH); |
4908 | + // 0x5Cが含まれる文字列を扱えないバグ修正 | |
4909 | + if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) | |
4910 | + || (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0)) | |
4911 | + *(Fname + strlen(Fname) - 1) = NUL; | |
4907 | 4912 | } |
4908 | 4913 | return(Ret); |
4909 | 4914 | } |
@@ -2151,6 +2151,11 @@ static void ChangeDir(int Win, char *Path) | ||
2151 | 2151 | char Local[FMAX_PATH+1]; |
2152 | 2152 | char Remote[FMAX_PATH+1]; |
2153 | 2153 | |
2154 | + // 同時接続対応 | |
2155 | + CancelFlg = NO; | |
2156 | + | |
2157 | + // デッドロック対策 | |
2158 | + DisableUserOpe(); | |
2154 | 2159 | Sync = AskSyncMoveMode(); |
2155 | 2160 | if(Sync == YES) |
2156 | 2161 | { |
@@ -2182,6 +2187,8 @@ static void ChangeDir(int Win, char *Path) | ||
2182 | 2187 | GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg); |
2183 | 2188 | } |
2184 | 2189 | } |
2190 | + // デッドロック対策 | |
2191 | + EnableUserOpe(); | |
2185 | 2192 | return; |
2186 | 2193 | } |
2187 | 2194 |
@@ -239,9 +239,12 @@ static int DoPWD(char *Buf) | ||
239 | 239 | if(strlen(Tmp) < FMAX_PATH) |
240 | 240 | { |
241 | 241 | strcpy(Buf, Tmp); |
242 | - ReplaceAll(Buf, '\\', '/'); | |
242 | + // 0x5Cが含まれる文字列を扱えないバグ修正 | |
243 | +// ReplaceAll(Buf, '\\', '/'); | |
243 | 244 | ChangeSepaRemote2Local(Buf); |
244 | 245 | ChangeFnameRemote2Local(Buf, FMAX_PATH); |
246 | + // 0x5Cが含まれる文字列を扱えないバグ修正 | |
247 | + ReplaceAll(Buf, '\\', '/'); | |
245 | 248 | } |
246 | 249 | else |
247 | 250 | Sts = FTP_ERROR*100; |
@@ -1324,13 +1327,21 @@ int ChangeFnameRemote2Local(char *Fname, int Max) | ||
1324 | 1327 | char *Buf; |
1325 | 1328 | char *Pos; |
1326 | 1329 | CODECONVINFO cInfo; |
1330 | + // バッファ上書きバグ対策 | |
1331 | + char *Buf2; | |
1327 | 1332 | |
1328 | 1333 | Sts = FFFTP_FAIL; |
1329 | 1334 | if((Buf = malloc(Max)) != NULL) |
1330 | 1335 | { |
1336 | + // バッファ上書きバグ対策 | |
1337 | + if((Buf2 = malloc(strlen(Fname) + 1)) != NULL) | |
1338 | + { | |
1331 | 1339 | InitCodeConvInfo(&cInfo); |
1332 | 1340 | cInfo.KanaCnv = NO; //AskHostNameKana(); |
1333 | - cInfo.Str = Fname; | |
1341 | + // バッファ上書きバグ対策 | |
1342 | +// cInfo.Str = Fname; | |
1343 | + strcpy(Buf2, Fname); | |
1344 | + cInfo.Str = Buf2; | |
1334 | 1345 | cInfo.StrLen = strlen(Fname); |
1335 | 1346 | cInfo.Buf = Buf; |
1336 | 1347 | cInfo.BufSize = Max - 1; |
@@ -1432,8 +1443,13 @@ int ChangeFnameRemote2Local(char *Fname, int Max) | ||
1432 | 1443 | // strcpy(Pos, Buf); |
1433 | 1444 | // break; |
1434 | 1445 | } |
1435 | - free(Buf); | |
1446 | + // バッファ上書きバグ対策 | |
1447 | + free(Buf2); | |
1436 | 1448 | Sts = FFFTP_SUCCESS; |
1449 | + } | |
1450 | + free(Buf); | |
1451 | + // バッファ上書きバグ対策 | |
1452 | +// Sts = FFFTP_SUCCESS; | |
1437 | 1453 | } |
1438 | 1454 | return(Sts); |
1439 | 1455 | } |
@@ -1456,13 +1472,21 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) | ||
1456 | 1472 | char *Buf; |
1457 | 1473 | char *Pos; |
1458 | 1474 | CODECONVINFO cInfo; |
1475 | + // バッファ上書きバグ対策 | |
1476 | + char *Buf2; | |
1459 | 1477 | |
1460 | 1478 | Sts = FFFTP_FAIL; |
1461 | 1479 | if((Buf = malloc(Max)) != NULL) |
1462 | 1480 | { |
1481 | + // バッファ上書きバグ対策 | |
1482 | + if((Buf2 = malloc(strlen(Fname) + 1)) != NULL) | |
1483 | + { | |
1463 | 1484 | InitCodeConvInfo(&cInfo); |
1464 | 1485 | cInfo.KanaCnv = AskHostNameKana(); |
1465 | - cInfo.Str = Fname; | |
1486 | + // バッファ上書きバグ対策 | |
1487 | +// cInfo.Str = Fname; | |
1488 | + strcpy(Buf2, Fname); | |
1489 | + cInfo.Str = Buf2; | |
1466 | 1490 | cInfo.StrLen = strlen(Fname); |
1467 | 1491 | cInfo.Buf = Buf; |
1468 | 1492 | cInfo.BufSize = Max - 1; |
@@ -1587,8 +1611,13 @@ int ChangeFnameLocal2Remote(char *Fname, int Max) | ||
1587 | 1611 | // strcpy(Pos, Buf); |
1588 | 1612 | // break; |
1589 | 1613 | } |
1590 | - free(Buf); | |
1614 | + // バッファ上書きバグ対策 | |
1615 | + free(Buf2); | |
1591 | 1616 | Sts = FFFTP_SUCCESS; |
1617 | + } | |
1618 | + free(Buf); | |
1619 | + // バッファ上書きバグ対策 | |
1620 | +// Sts = FFFTP_SUCCESS; | |
1592 | 1621 | } |
1593 | 1622 | return(Sts); |
1594 | 1623 | } |