2014-06-18 1 views
0

제 쿠다 프로젝트의 경우 장치 기능에 단일 정수를 제공하고 싶습니다. 내 기능은장치 기능에 정수를 전송하는 기능이 작동하지 않습니다.

__device__ void PBKDF2_CUDA(const uint8_t password[], const int pass_len, const uint8_t Essid[], const int Essid_len, const int c, const int dkLen, uint32_t T_ptr[], int *PW_len_test) 
{ 
    uint32_t Hash_ptr[5] = {0}; 
    uint32_t L[5]={0,0,0,0,0}; 
    uint32_t T[8] = {0}; 

    //Maybe working 
    /*uint8_t * password_shrinked = (uint8_t*)malloc(8 + 1); 
    for(int i = 0; i < 8; i++) 
     password_shrinked[i] = password[i]; 
    password_shrinked[8 + 1] = 0;*/ 
    int password_len = pass_len; 
    if (pass_len != 8) 
    { 
     *PW_len_test = pass_len; 
     password_len = 8; 
    } 
    uint8_t * password_shrinked = (uint8_t*)malloc(sizeof(uint8_t)*(password_len + 1)); 
    for (int i = 0; i < password_len; i++) 
     password_shrinked[i] = password[i]; 
    password_shrinked[password_len + 1] = 0; 
    //Some other stuff 
    free(password_shrinked); 
}; 

처럼 보이는이 같은 커널에서 호출 해요 :

__global__ void kernel(uint8_t Password_list[], const int *Password_len, uint8_t Essid[], int *Essid_len, int *rounds,int *dkLen, uint32_t T[], int pmk_size, int *PW_len_test) 
{ 
    int idx= threadIdx.x + blockDim.x*blockIdx.x; 
    printf("Password_len is: %d\n", Password_len); 
    PBKDF2_CUDA(Password_list+idx*(8), 8, Essid, *Essid_len, *rounds, *dkLen, T+idx*pmk_size, PW_len_test + idx*sizeof(int)); 
} 

주요 기능에 커널 호출 :

kernel<<<BLOCKS, THREADS>>>(Pass_d, Pass_len_d, Essid_d, Essid_len_d, rounds_d, key_len_d, PMK_d, PMK_size, PW_len_test_d); 

을 지금에 관계없이 내가 설정 한 경우 Pass_len_d ~ 8 또는 Pass_len_d 대신 8으로 커널을 호출하면 장치 기능이 가비지를 생성합니다 잘못된 값을 반환, 아래 설명 참조). 커널 함수 (위 참조) 또는 장치 함수에서 값을 수동으로 설정 한 경우에만 작동합니다.
가비지에서는 일부 반환 값이 암호 목록 (uint8_t 배열)에서 올바르게 계산되지 않지만 다른 값은 올바르게 계산된다는 것을 의미합니다. 어느 단어가 매번 실행될 때 올바르게 계산 된 변경이므로, 어딘가에 경쟁 조건이 있다고 가정하지만 찾을 수는 없습니다.

+1

올바른 cuda 오류 검사를 수행하고 있습니까? cuda-memcheck로 코드를 실행 했습니까? 보고 된 오류가 있습니까? –

답변

2

버퍼 오버플로가 하나 이상 있습니다.

password_shrinked[password_len + 1] = 0;은 할당 된 것보다 1 바이트 위에 씁니다.

password_len + 1 바이트를 할당하면 배열의 마지막 위치는 password_len입니다.

+0

예, 오류입니다. 감사합니다. –

관련 문제