Develop and Download Open Source Software

Browse Subversion Repository

Diff of /trunk/ttssh2/ttxssh/hosts.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9506 by zmatsuo, Fri Oct 29 15:19:22 2021 UTC revision 9553 by youlab, Fri Dec 3 11:43:08 2021 UTC
# Line 1372  static void delete_different_key(PTInstV Line 1372  static void delete_different_key(PTInstV
1372          else {          else {
1373                  Key key; // known_hostsに登録されている鍵                  Key key; // known_hostsに登録されている鍵
1374                  int length;                  int length;
1375                  char filename[MAX_PATH];                  wchar_t *filename = NULL;
 #if _MSC_VER < 1900 // less than VSC2015(VC14.0)  
                 char tmp[L_tmpnam];  
 #endif  
1376                  int fd;                  int fd;
1377                  int amount_written = 0;                  int amount_written = 0;
1378                  int close_result;                  int close_result;
1379                  int data_index = 0;                  int data_index = 0;
1380                  wchar_t *buf;                  char *newfiledata = NULL;
1381                  wchar_t *filenameW;                  int ret;
1382                    struct _stat fileStat;
1383                  // 書き込み一時ファイルを開く                  long newFilePos = 0, totalSize;
1384  #if _MSC_VER < 1900 // less than VSC2015(VC14.0)  
1385                  _getcwd(filename, sizeof(filename));                  // known_hostsファイルサイズを取得する。
1386                  tmpnam_s(tmp, sizeof(tmp));                  filename = get_home_dir_relative_nameW(name);
1387                  strcat_s(filename, sizeof(filename), tmp);                  ret = _wstat(filename, &fileStat);
1388  #else // VSC2015(VC14.0) or later                  if (ret != 0) {
1389                  tmpnam_s(filename, sizeof(filename));                          // error
1390  #endif                          goto error;
                 fd = _open(filename,  
                           _O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC,  
                           _S_IREAD | _S_IWRITE);  
   
                 if (fd == -1) {  
                         if (errno == EACCES) {  
                                 UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,  
                                                   "An error occurred while trying to write the host key.\n"  
                                                   "You do not have permission to write to the known-hosts file.");  
                                 notify_nonfatal_error(pvar, pvar->ts->UIMsg);  
                         } else {  
                                 UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,  
                                                   "An error occurred while trying to write the host key.\n"  
                                                   "The host key could not be written.");  
                                 notify_nonfatal_error(pvar, pvar->ts->UIMsg);  
                         }  
                         return;  
1391                  }                  }
1392                    // ファイルデータのメモリを確保する。
1393                    totalSize = fileStat.st_size;
1394                    newfiledata = malloc(totalSize);
1395                    if (newfiledata == NULL) {
1396                            // error
1397                            goto error;
1398                    }
1399    
1400    
1401                  // ファイルから読み込む                  // ファイルから読み込む
1402                  memset(&key, 0, sizeof(key));                  memset(&key, 0, sizeof(key));
# Line 1513  static void delete_different_key(PTInstV Line 1501  static void delete_different_key(PTInstV
1501                          // 書き込み処理                          // 書き込み処理
1502                          if (do_write) {                          if (do_write) {
1503                                  length = pvar->hosts_state.file_data_index - data_index;                                  length = pvar->hosts_state.file_data_index - data_index;
                                 amount_written =  
                                         _write(fd, pvar->hosts_state.file_data + data_index,  
                                                length);  
1504    
1505                                  if (amount_written != length) {                                  if ((newFilePos + length) >= totalSize) {
1506                                          goto error1;                                          UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1507                                  }                                                  "An error occurred while trying to write the host key.\n"
1508                                                    "The host key could not be written.");
1509                                            notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1510                                            goto error;
1511                                    }              
1512    
1513                                    memcpy(newfiledata + newFilePos,
1514                                            pvar->hosts_state.file_data + data_index,
1515                                            length);
1516                                    newFilePos += length;
1517    
1518                          }                          }
1519                          data_index = pvar->hosts_state.file_data_index;                          data_index = pvar->hosts_state.file_data_index;
1520                  } while (1); // 最後まで読む                  } while (1); // 最後まで読む
1521    
1522  error1:                  finish_read_host_files(pvar, 0);
1523    
1524                    // 最後にメモリを解放しておく。
1525                    key_init(&key);
1526    
1527                    // known_hostsファイルに新しいファイルデータで上書きする。
1528                    fd = _wopen(filename,
1529                            _O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC,
1530                            _S_IREAD | _S_IWRITE);
1531    
1532                    if (fd == -1) {
1533                            if (errno == EACCES) {
1534                                    UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
1535                                            "An error occurred while trying to write the host key.\n"
1536                                            "You do not have permission to write to the known-hosts file.");
1537                                    notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1538                            }
1539                            else {
1540                                    UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1541                                            "An error occurred while trying to write the host key.\n"
1542                                            "The host key could not be written.");
1543                                    notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1544                            }
1545                            goto error;
1546                    }
1547    
1548                    amount_written = _write(fd, newfiledata, newFilePos);
1549                  close_result = _close(fd);                  close_result = _close(fd);
1550                  if (amount_written != length || close_result == -1) {                  if (amount_written != newFilePos || close_result == -1) {
1551                          UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,                          UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1552                                            "An error occurred while trying to write the host key.\n"                                  "An error occurred while trying to write the host key.\n"
1553                                            "The host key could not be written.");                                  "The host key could not be written.");
1554                          notify_nonfatal_error(pvar, pvar->ts->UIMsg);                          notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1555                          goto error2;                          goto error;
1556                  }                  }              
   
                 // 書き込み一時ファイルからリネーム  
                 buf = get_home_dir_relative_nameW(name);  
                 _wunlink(buf);  
                 filenameW = ToWcharA(filename);  
                 _wrename(filenameW, buf);  
                 free(buf);  
                 free(filenameW);  
1557    
1558  error2:  error:
1559                  _unlink(filename);                  free(filename);
1560    
1561                  finish_read_host_files(pvar, 0);                  if (newfiledata) {
1562                            free(newfiledata);
1563                    }
1564    
                 // 最後にメモリを解放しておく。  
                 key_init(&key);  
1565          }          }
1566  }  }
1567    
# Line 1571  void HOSTS_delete_all_hostkeys(PTInstVar Line 1584  void HOSTS_delete_all_hostkeys(PTInstVar
1584          else {          else {
1585                  Key key; // known_hostsに登録されている鍵                  Key key; // known_hostsに登録されている鍵
1586                  int length;                  int length;
1587                  char filename[MAX_PATH];                  wchar_t *filename = NULL;
 #if _MSC_VER < 1900 // less than VSC2015(VC14.0)  
                 char tmp[L_tmpnam];  
 #endif  
1588                  int fd;                  int fd;
1589                  int amount_written = 0;                  int amount_written = 0;
1590                  int close_result;                  int close_result;
1591                  int data_index = 0;                  int data_index = 0;
1592                  wchar_t *buf;                  char *newfiledata = NULL;
1593                  wchar_t *filenameW;                  int ret;
1594                    struct _stat fileStat;
1595                  // 書き込み一時ファイルを開く                  long newFilePos = 0, totalSize;
1596  #if _MSC_VER < 1900 // less than VSC2015(VC14.0)  
1597                  _getcwd(filename, sizeof(filename));                  // known_hostsファイルサイズを取得する。
1598                  tmpnam_s(tmp, sizeof(tmp));                  filename = get_home_dir_relative_nameW(name);
1599                  strcat_s(filename, sizeof(filename), tmp);                  ret = _wstat(filename, &fileStat);
1600  #else // VSC2015(VC14.0) or later                  if (ret != 0) {
1601                  tmpnam_s(filename, sizeof(filename));                          // error
1602  #endif                          goto error;
1603                  fd = _open(filename,                  }
1604                          _O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC,                  // ファイルデータのメモリを確保する。
1605                          _S_IREAD | _S_IWRITE);                  totalSize = fileStat.st_size;
1606                    newfiledata = malloc(totalSize);
1607                  if (fd == -1) {                  if (newfiledata == NULL) {
1608                          if (errno == EACCES) {                          // error
1609                                  UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,                          goto error;
                                         "An error occurred while trying to write the host key.\n"  
                                         "You do not have permission to write to the known-hosts file.");  
                                 notify_nonfatal_error(pvar, pvar->ts->UIMsg);  
                         }  
                         else {  
                                 UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,  
                                         "An error occurred while trying to write the host key.\n"  
                                         "The host key could not be written.");  
                                 notify_nonfatal_error(pvar, pvar->ts->UIMsg);  
                         }  
                         return;  
1610                  }                  }
1611    
1612                  // ファイルから読み込む                  // ファイルから読み込む
# Line 1710  void HOSTS_delete_all_hostkeys(PTInstVar Line 1709  void HOSTS_delete_all_hostkeys(PTInstVar
1709                          // 書き込み処理                          // 書き込み処理
1710                          if (do_write) {                          if (do_write) {
1711                                  length = pvar->hosts_state.file_data_index - data_index;                                  length = pvar->hosts_state.file_data_index - data_index;
1712                                  amount_written =  
1713                                          _write(fd, pvar->hosts_state.file_data + data_index,                                  if ((newFilePos + length) >= totalSize) {
1714                                            UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1715                                                    "An error occurred while trying to write the host key.\n"
1716                                                    "The host key could not be written.");
1717                                            notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1718                                            goto error;
1719                                    }              
1720    
1721                                    memcpy(newfiledata + newFilePos,
1722                                            pvar->hosts_state.file_data + data_index,
1723                                          length);                                          length);
1724    
                                 if (amount_written != length) {  
                                         goto error1;  
                                 }  
1725                          }                          }
1726                          data_index = pvar->hosts_state.file_data_index;                          data_index = pvar->hosts_state.file_data_index;
1727                  } while (1); // 最後まで読む                  } while (1); // 最後まで読む
1728    
1729          error1:                  finish_read_host_files(pvar, 0);
1730    
1731                    // 最後にメモリを解放しておく。
1732                    key_init(&key);
1733    
1734                    // known_hostsファイルに新しいファイルデータで上書きする。
1735                    fd = _wopen(filename,
1736                            _O_CREAT | _O_WRONLY | _O_SEQUENTIAL | _O_BINARY | _O_TRUNC,
1737                            _S_IREAD | _S_IWRITE);
1738    
1739                    if (fd == -1) {
1740                            if (errno == EACCES) {
1741                                    UTIL_get_lang_msg("MSG_HOSTS_WRITE_EACCES_ERROR", pvar,
1742                                            "An error occurred while trying to write the host key.\n"
1743                                            "You do not have permission to write to the known-hosts file.");
1744                                    notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1745                            }
1746                            else {
1747                                    UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1748                                            "An error occurred while trying to write the host key.\n"
1749                                            "The host key could not be written.");
1750                                    notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1751                            }
1752                            goto error;
1753                    }
1754    
1755                    amount_written = _write(fd, newfiledata, newFilePos);
1756                  close_result = _close(fd);                  close_result = _close(fd);
1757                  if (amount_written != length || close_result == -1) {                  if (amount_written != newFilePos || close_result == -1) {
1758                          UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,                          UTIL_get_lang_msg("MSG_HOSTS_WRITE_ERROR", pvar,
1759                                  "An error occurred while trying to write the host key.\n"                                  "An error occurred while trying to write the host key.\n"
1760                                  "The host key could not be written.");                                  "The host key could not be written.");
1761                          notify_nonfatal_error(pvar, pvar->ts->UIMsg);                          notify_nonfatal_error(pvar, pvar->ts->UIMsg);
1762                          goto error2;                          goto error;
1763                  }                  }              
   
                 // 書き込み一時ファイルからリネーム  
                 buf = get_home_dir_relative_nameW(name);  
                 _wunlink(buf);  
                 filenameW = ToWcharA(filename);  
                 _wrename(filenameW, buf);  
                 free(filenameW);  
                 free(buf);  
1764    
1765          error2:  error:
1766                  _unlink(filename);                  free(filename);
1767    
1768                  finish_read_host_files(pvar, 0);                  if (newfiledata) {
1769                            free(newfiledata);
1770                    }
1771    
                 // 最後にメモリを解放しておく。  
                 key_init(&key);  
1772          }          }
1773  }  }
1774    

Legend:
Removed from v.9506  
changed lines
  Added in v.9553

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26