Ale*_*ini 0 c powershell buffer overflow
我正在开发一个函数,该函数执行特定的 powershell 命令,然后返回输出(如果与 EOF 不同)。该函数第一次正确执行,但第二次输出很奇怪,表明我的代码的某些部分存在缓冲区溢出。我找不到它。否则,我无法为这种行为找出其他可能的解决方案。
\n这是代码:
\nchar* buffer_reset(char* buffer);\nbool jobsreader (const char* printer_name, char* buffer);\n\nint main (int argc, char *argv[]) {\n char buffer[1000];\n char* pbuffer = buffer;\n jobsreader("Microsoft Print to PDF", pbuffer);\n pbuffer = buffer_reset(pbuffer);\n jobsreader("Microsoft Print to PDF", pbuffer);\n return 0;\n}\n\nchar* buffer_reset(char* buffer) {\n char* memory_reset = &buffer[0];\n char* start = memory_reset;\n while (*memory_reset != '\\0') {\n *memory_reset = '\\0';\n memory_reset++;\n }\n buffer = start;\n return buffer;\n}\n\nbool jobsreader (const char* printer_name, char* buffer) {\n FILE *output;\n const char* cmd = "powershell -Command Get-PrintJob '";\n int dim = (strlen(cmd)+1+strlen(printer_name)+1+2);\n char powershell[dim]; // + 1 per carattere \\0 + 1 per carattere \\0 + 2 per stringa "'\\0"\n strcat(powershell, cmd);\n strcat(powershell, printer_name);\n strcat(powershell, "'");\n\n fflush(stdout);\n printf("%s\\n", powershell);\n\n output = popen(powershell, "r"); // Esegue il comando shell e restituisce un puntatore a FILE\n if (output == NULL) {\n printf("Error in executing the command: are you sure this printer exists?\\n");\n pclose(output); // Chiude il file\n return false;\n } else {\n char c;\n // Se c'\xc3\xa8 un processo in corso (quindi output della shell diverso da EOF)\n while ((c = getc(output)) != EOF) {\n *buffer = c;\n printf("%c", c); // Stampa a video del processo in corso\n buffer++;\n }\n printf("\\n");\n\n *buffer = '\\0';\n pclose(output); // Chiude il file\n return true;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n输出 1:powershell -Command Get-PrintJob 'Microsoft Print to PDF'(正常)\n输出 2,3,4 ...:powershe@powershell -Command Get-PrintJob 'Microsoft Print to PDF'(错误)
\n有人可以帮助我吗?
\n我想输出并执行以下 powershell 命令:Get-PrintJob <printer_name>
\n问题是这两行:
char powershell[dim];
strcat(powershell, cmd);
Run Code Online (Sandbox Code Playgroud)
该数组未初始化,其内容不确定。
更具体地说,它不能用作空终止字符串,这是所strcat期望的。因此,您将出现未定义的行为。
您必须从调用开始strcpy:
strcpy(powershell, cmd);
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用snprintf而不是多个strcpyandstrcat调用:
snprintf(powershell, dim, "powershell -Command Get-PrintJob '%s'", printer_name);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |