ipmsg365src 问题修复
来源:互联网 发布:王思聪雪梨的淘宝店铺 编辑:程序博客网 时间:2024/05/21 09:16
在src\recvdlg.cpp文件里,函数BOOL TRcvDlg::RecvDirFile(void)中存在一个bug,该bug导致自动接收时,接收文件体积大小的门限值乘积产生溢出,不对过大的文件进行接收;需要做如下修改:
BOOL TRecvDlg::RecvDirFile(void){#define PEEK_SIZE 8 if (fileObj->status == FS_DIRFILESTART || fileObj->status == FS_TRANSINFO) { int size; if (fileObj->infoLen == 0) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, PEEK_SIZE - (int)fileObj->offset, 0)) <= 0) { return FALSE; } if (fileObj->aes.IsKeySet()) { fileObj->aes.DecryptCTR((const BYTE *)fileObj->info + (int)fileObj->offset, (BYTE *)fileObj->info + (int)fileObj->offset, size); } if ((fileObj->offset += size) < PEEK_SIZE) { return TRUE; } fileObj->info[fileObj->offset] = 0; fileObj->infoLen = strtoul(fileObj->info, 0, 16); if (fileObj->infoLen >= sizeof(fileObj->info) -1 || fileObj->infoLen <= 0) { return FALSE; // too big or small } } if (fileObj->offset < fileObj->infoLen) { if ((size = ::recv(fileObj->conInfo->sd, fileObj->info + (int)fileObj->offset, fileObj->infoLen - (int)fileObj->offset, 0)) <= 0) { return FALSE; } if (fileObj->aes.IsKeySet()) { fileObj->aes.DecryptCTR((const BYTE *)fileObj->info + (int)fileObj->offset, (BYTE *)fileObj->info + (int)fileObj->offset, size); } fileObj->offset += size; } if (fileObj->offset == fileObj->infoLen) { fileObj->info[fileObj->infoLen] = 0; if (!DecodeDirEntry(fileObj->info, &fileObj->curFileInfo, fileObj->isDir ? fileObj->u8fname : NULL)) { return FALSE; // Illegal entry } if (isAutoSave) { if (fileObj->totalTrans + fileObj->curFileInfo.Size() > (int64)cfg->autoSaveMax * 1000 * 1000) return FALSE; // 添加(int64) } fileObj->offset = fileObj->infoLen = 0; // 初期化 DWORD attr = fileObj->curFileInfo.Attr(); if (GET_MODE(attr) == IPMSG_FILE_DIR) { char buf[MAX_BUF]; const char *fname = (fileObj->dirCnt == 0) ? fileObj->fileInfo->Fname() : fileObj->curFileInfo.Fname(); if (!fileObj->isDir) return FALSE; if (MakePath(buf, fileObj->path, fname) >= MAX_PATH_U8) { MessageBoxU8(buf, GetLoadStrU8(IDS_PATHTOOLONG)); return FALSE; } if (!IsSafePath(buf, fname)) { return FALSE; } if (!CreateDirectoryU8(buf, NULL)) { return FALSE; } strncpyz(fileObj->path, buf, MAX_PATH_U8); fileObj->dirCnt++; } else if (GET_MODE(attr) == IPMSG_FILE_RETPARENT) { if (!fileObj->isDir) return FALSE; if (fileObj->curFileInfo.Mtime()) { // directory の time stamp をあわせる(NT系のみ) FILETIME ft; HANDLE hFile; UnixTime2FileTime(fileObj->curFileInfo.Mtime(), &ft); if ((hFile = CreateFileU8(fileObj->path, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)) != INVALID_HANDLE_VALUE) { ::SetFileTime(hFile, NULL, NULL, &ft); ::CloseHandle(hFile); } } if (fileObj->curFileInfo.Attr() & IPMSG_FILE_RONLYOPT) { SetFileAttributesU8(fileObj->path, FILE_ATTRIBUTE_READONLY); } if (--fileObj->dirCnt <= 0) { fileObj->status = FS_COMPLETE; return TRUE; } if (!GetParentDirU8(fileObj->path, fileObj->path)) { return FALSE; } } else { if (fileObj->isDir && fileObj->dirCnt == 0) { return FALSE; } if (fileObj->curFileInfo.Size() == 0) { // 0byte file if (OpenRecvFile()) { // 0byteの場合は作成失敗を無視 CloseRecvFile(TRUE); } if (!fileObj->isDir) { fileObj->status = FS_COMPLETE; return TRUE; } } fileObj->status = fileObj->curFileInfo.Size() ? FS_TRANSFILE : FS_TRANSINFO; } return TRUE; } } if (fileObj->status == FS_TRANSFILE) { if (!RecvFile()) { CloseRecvFile(); return FALSE; } if (fileObj->status == FS_ENDFILE || fileObj->status == FS_COMPLETE) { CloseRecvFile(TRUE); if (!fileObj->isDir) return TRUE; fileObj->status = FS_TRANSINFO; } } return TRUE;}
0 0
- ipmsg365src 问题修复
- 修复缓冲区溢出问题!
- 修复缓冲区溢出问题!
- 修复缓冲区溢出问题
- 修复缓冲区溢出问题
- 遥感问题:条带修复
- 修复缓冲区溢出问题
- grub rescue问题修复
- mysql修复问题表
- github显示问题修复
- LSP问题修复
- AndFix热修复问题
- Windows 问题修复方法
- 修复xfs文件系统问题
- Ubuntu问题修复
- 绘声绘影X8问题修复
- 虚拟按键问题 修复
- 修复Homebrew权限问题
- 华为交换机stp简单配置
- 从sql执行计划看懂sql执行步骤
- C++ primer plus读书笔记(一)
- jee、spring、spring mvc、mybatis 学习(八)
- WPF 串口助手
- ipmsg365src 问题修复
- ScrollView嵌套GridView,加载完成后默认不显示顶部
- 第三章 数据竞争与互斥对象
- MYSQL删除表的记录后如何使ID从1开始
- jenkisn 结合maven+svn部署web应该到tomcat
- Inflater—— LayoutInflater和findViewById()
- AD10 元器件库和封装库的说明(标准封装的尺寸 三极管的封装 封装名后L M N的含义 PCB封装中的紫线的意思)
- 第四章 死锁
- 关于Xcode 7.3 7.3.1 断点 卡死 无限菊花