«Ошибка проверки времени выполнения # 2 - стек вокруг переменной filePath был поврежден» в режиме отладки - PullRequest
3 голосов
/ 22 октября 2010

У меня проблема с этой функцией при использовании winsock2.Когда программа покидает эту функцию в режиме отладки, я получаю 2 утверждения (только при выходе из этой функции):

«Ошибка проверки времени выполнения # 2 - стек вокруг переменной filePath поврежден».

«Ошибка проверки времени выполнения # 2 - стек вокруг переменной« recBuf »поврежден».

Я программирую на VS2008 C ++ (консольное приложение).В режиме Release этого заявления не существует.

Поэтому я жду ответа и большое спасибо за вашу помощь;)

Функция:

#include "stdafx.h"
#include "server.h"

bool Server::fileReceive()
{
    char recBuf[MAX_PACKET_BUFOR] ={0};
    char filePath[100] = {0};
    int size = 0;
    int var = 0;
    char key = 0;
    int tmp=0;

    FILE *fPtr = NULL;

    if(recv(clientSocket, recBuf, MAX_PACKET_SIZE, 0) == 0)
    {
        cerr << "Receive ERROR" << endl;
        system("pause");
        return false;
    }
    if(strcmp(recBuf, START_HEADER) != 0)
        return false;

    if(send(clientSocket, ACK, 3, 0 ) == SOCKET_ERROR)
    {
        cerr << "Send ERROR" << endl;
        system("pause");
        return false;
    }
    if(recv(clientSocket, recBuf, MAX_PACKET_SIZE, 0) == 0)
    {
        cerr << "Receive ERROR" << endl;
        system("pause");
        return false;
    }
    if(send(clientSocket, ACK, 3, 0 ) == SOCKET_ERROR)
    {
        cerr << "Send ERROR" << endl;
        system("pause");
        return false;
    }
    strcpy_s(filePath, sizeof(recBuf), recBuf);
    cout << "Przyslano plik o nazwie: \"" << filePath << "\"";
    memset(recBuf, 0, sizeof(recBuf));

    if(recv(clientSocket, recBuf, MAX_PACKET_SIZE, 0) == 0)
    {
        cerr << "Receive ERROR" << endl;
        system("pause");
        return false;
    }
    if(send(clientSocket, ACK, 3, 0 ) == SOCKET_ERROR)
    {
        cerr << "Send ERROR" << endl;
        system("pause");
        return false;
    }
    size = atoi(recBuf);
    cout << " i rozmiarze: "<< size << "B,\nCo chcesz zrobic?" << endl;
    cout << "1 - odbierz i zmien nazwe\n2- odbierz i zapisz do katalogu programu\n3 - odrzuc" << endl;
    key = _getch();

    if(key == '1' || key == '2')
    {
        if(key == '1')
        {
            cout << "Podaj sciezke dla nowego pliku w formie: Dysk:\\sciezka\\plik.rozszerzenie" << endl;
            cout << "(wpisz sama nazwe, a plik zostanie umieszczony w katalogu programu)" << endl;
            cin >> filePath;
        }

        if(fopen_s(&fPtr, filePath, "wb") != 0)
            return false;

        cout << "Odbieranie w toku...\nProsze czekac" << endl;

        while(size > 0)
        {
            memset(recBuf, 0, MAX_PACKET_BUFOR);
            tmp = 0;
            if(size <= 200000)
                cout << "break" << endl;
            if(size>=MAX_PACKET_SIZE)
            {
                do
                {
                    var = recv(clientSocket, recBuf, MAX_PACKET_SIZE, 0);
                    if(var == 0)
                    {
                        cerr << "Receive ERROR" << endl;
                        system("pause");
                        size = 0;
                    }
                    else
                    {
                        tmp += var;
                        fwrite(recBuf, var, 1, fPtr);
                    }
                }while(tmp < MAX_PACKET_SIZE && size != 0);
                                    if(send(clientSocket, ACK, 3, 0 ) == SOCKET_ERROR)
                    {
                        cerr << "Send ERROR" << endl;
                        system("pause");
                        return false;
                    }
            }
            else
            {
                while(tmp != size && size != 0)
                {
                    var = recv(clientSocket, recBuf, size, 0);
                    if(var == 0)
                    {
                        cerr << "Receive ERROR" << endl;
                        system("pause");
                        size = 0;
                    }
                    else
                    {
                        tmp += var;
                        fwrite(recBuf, var, 1, fPtr);
                    }
                }
                if(send(clientSocket, ACK, 3, 0 ) == SOCKET_ERROR)
                {
                    cerr << "Send ERROR" << endl;
                    system("pause");
                    return false;
                }
            }
            size -= tmp;
            size = (size < 0) ? 0 : size;
        }
        memset(filePath, 0, sizeof(filePath));
        memset(recBuf, 0, MAX_PACKET_BUFOR);
        fclose(fPtr);
    }
    return true;
}

stdafx.ч

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

#define START_HEADER "FileSend"
#define MAX_PACKET_SIZE    100000
#define MAX_PACKET_BUFOR    100010
#define ACK "ACK"

1 Ответ

4 голосов
/ 22 октября 2010

Ошибка в следующей строке

strcpy_s(filePath, sizeof(recBuf), recBuf); 

Здесь вы указываете, что размер filePath равен sizeof(recBuf), что не так. Размер filePath равен 100, а sizeof(recBuf) равен 1000010. В результате переполнение буфера при filePath и сообщение об ошибке, которое вы видите.

Кроме того, появляется код, предполагающий, что вызов recv правильно добавит нулевой терминатор в буфер recBuf. Это не тот случай, и если 0 не будет добавлено в буфер, функция strcpy_s также потенциально может выйти из строя.

...