使用popen()时出现细分错误

时间:2019-04-02 15:42:58

标签: c popen

我有一个加密某些字符串的功能。 太棒了,但是...是个错误:(

我可以一次使用该功能,但是第二次崩溃。

谢谢! :)

我正在使用bash ubuntu(W10),在编译项目时没有警告(和错误)。

char * encryptPassword(char * string){
    printf("DEBUT\n");
    FILE *fp=NULL;
    char path[1035];
    char password[32];
    //char * password = NULL; //for the encrypt password
    printf("MALLOC\n");
    //password = (char *)malloc(33*sizeof(char));
    char * result = NULL;
    char chaine[128] = "echo "; 
    char end_chaine[128] = " | openssl md5 | cut -d ' ' -f2"; 
    //Create the command
    printf("STRCAT\n");
    strcat(chaine,string); 
    strcat(chaine,end_chaine); 
    //Execute
    printf("POPEN %s\n",chaine);
    fp = popen(chaine, "r");
    //Reclaim the encrypted password
    printf("GETS\n");
    fgets(path, sizeof(path)-1, fp);
    pclose(fp);
    //To remove the character '\n'
    printf("SPRINTF\n");
    sprintf(password,"%32s",path);
    result = strtok(password,"\n");
    printf("%s\n",result);
    //OK IT'S FINISH !
    return (result);
}

1 个答案:

答案 0 :(得分:1)

  

使用popen()时出现细分错误

您的问题可能在这里:

 strcat(chaine,string); 

如果输入参数 string 更多,则其他字段对于 chaine 来说太大,在这种情况下,您会以未定义的行为将其写出(在您的情况)

计算所需的长度,然后分配字符串以填充它。

请注意,您可以通过两次调用 snprintf 的方式来懒惰地执行此操作,第一次调用计算所需的大小,第二次调用填充命令。这是一种懒惰的方式,因为在这里您只需连接字符串,而不用写数字等不需要大小不固定的数字。


但是在 popen 之后也可以在这里:

sprintf(password,"%32s",path);

因为密码的大小为32,而 sprintf 将写入33个字符,并且还会放置最后一个空字符


如果您奇迹般地从函数中返回,您可能无法使用结果,因为它为NULL或指向堆栈的指针不再有效 password 是局部变量,因此 strtok 返回NULL或密码的地址成为函数的结果