C语言 可能无法识别的缓冲区溢出

z18hc3ub  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

我正在处理一个函数,它执行一个特定的powershell命令,然后返回输出,如果这是不同的task。函数第一次正确执行,但第二次输出是奇怪的,信号有一个缓冲区溢出在我的代码的某一部分。我找不到它。否则,我无法找出这种行为的其他可能的解决方案。
下面是代码:

char* buffer_reset(char* buffer);
bool jobsreader (const char* printer_name, char* buffer);

int main (int argc, char *argv[]) {
    char buffer[1000];
    char* pbuffer = buffer;
    jobsreader("Microsoft Print to PDF", pbuffer);
    pbuffer = buffer_reset(pbuffer);
    jobsreader("Microsoft Print to PDF", pbuffer);
    return 0;
}

char* buffer_reset(char* buffer) {
    char* memory_reset = &buffer[0];
    char* start = memory_reset;
    while (*memory_reset != '\0') {
        *memory_reset = '\0';
        memory_reset++;
    }
    buffer = start;
    return buffer;
}

bool jobsreader (const char* printer_name, char* buffer) {
    FILE *output;
    const char* cmd = "powershell -Command Get-PrintJob '";
    int dim = (strlen(cmd)+1+strlen(printer_name)+1+2);
    char powershell[dim]; // + 1 per carattere \0 + 1 per carattere \0 + 2 per stringa "'\0"
    strcat(powershell, cmd);
    strcat(powershell, printer_name);
    strcat(powershell, "'");

    fflush(stdout);
    printf("%s\n", powershell);

    output = popen(powershell, "r"); // Esegue il comando shell e restituisce un puntatore a FILE
    if (output == NULL) {
        printf("Error in executing the command: are you sure this printer exists?\n");
        pclose(output); // Chiude il file
        return false;
    } else {
        char c;
        // Se c'è un processo in corso (quindi output della shell diverso da EOF)
        while ((c = getc(output)) != EOF) {
            *buffer = c;
            printf("%c", c); // Stampa a video del processo in corso
            buffer++;
        }
        printf("\n");

        *buffer = '\0';
        pclose(output); // Chiude il file
        return true;
    }
}

字符串
输出1:powershell -Command Get-PrintJob 'Microsoft Print to PDF'(OK)输出2,3,4.:powershe@powershell -Command Get-PrintJob 'Microsoft Print to PDF'(WRONG)
有人能帮帮我吗?
我想输出并执行以下powershell命令:Get-PrintJob<printer_name>

2ledvvac

2ledvvac1#

问题是这两行:

char powershell[dim];
strcat(powershell, cmd);

字符串
数组没有初始化,它的内容是 * 不确定的 *。
更具体地说,它不能被用作空终止字符串,这是strcat所期望的。因此,您将具有 *undefined行为 *。
您必须开始使用strcpy调用:

strcpy(powershell, cmd);


或者,您可以使用snprintf而不是多个strcpystrcat调用:

snprintf(powershell, dim, "powershell -Command Get-PrintJob '%s'", printer_name);

相关问题