ipmsg365src 问题修复
2016-08-17 09:08
459 查看
在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; }
相关文章推荐
- 使用APMserver+Discuz! 为公司搭建企业论坛
- rpm安装mysql5.6
- 未完结第八节 JBPM流程节点
- 【笔记】PMBOK第11章项目风险管理
- 产品经理如何做好需求过滤——一数据
- 产品经理如何做好需求过滤——三度
- 产品经理如何做好需求过滤——二性
- 实习的感悟
- 产品经理应该有这样的产品思维
- BPMN-Activiti信号中间件实例
- npm常用命令
- 谈谈Grunt,NPM,Gulp
- Leapmotion 感悟
- npm install
- ESP8266 PMW介绍
- 自制rpm包(一)
- IMX6Q LTIB 安装编译错误的解决办法
- [置顶] 产品经理面试题
- 第七节 JBPM 中的脚本语言
- 26:IPMaskCheck识别有效的ip地址和掩码并分类统计