Note that there are some explanatory texts on larger screens.

plurals
  1. POCalling multiple _popen fails
    text
    copied!<p>I am having a problem with <code>_popen(const char *, const char *)</code></p> <p>I'm trying to use awk to get infos from adb but my program crashes at the second _popen call (the method is called twice).</p> <p>Here is the problematic code (<code>sysinf_getvalue()</code> is called multiple times in the main).</p> <hr> <h1>Ugly code</h1> <pre><code>int deviceadbinfowritten = 0; int devicebootloaderinfowritten = 0; int adbinit = 0; int initadb() { if(!adbinit) { system("adb kill-server &amp;&amp; adb start-server"); adbinit = 1; } return 0; } int sysinfo_getadbinfofile() { if(!deviceadbinfowritten) { system("echo Please connect your device &amp;&amp; adb wait-for-device &amp;&amp; adb.exe shell getprop &gt; deviceinfo"); deviceadbinfowritten = 1; } return 0; } int sysinfo_getbootloaderinfofile() { if(!devicebootloaderinfowritten) { system("adb wait-for-device &amp;&amp; adb reboot bootloader &amp;&amp; fastboot getvar all &gt; bootloaderinfo &amp;&amp; fastboot reboot"); devicebootloaderinfowritten = 1; } return 0; } char *sysinfo_getvalue(char *key, int bootloader) { initadb(); if(bootloader) sysinfo_getbootloaderinfofile(); else sysinfo_getadbinfofile(); char *file = (bootloader)?"bootloaderinfo":"deviceinfo"; char *command = malloc(sizeof(char) * (strlen("awk.exe -F\":\" \" { print $2 }\" &lt; ") + strlen(key) + (bootloader)?0:2 + strlen(file))); char *adbkey = malloc((strlen(key)+2)* (sizeof(char))); if(!bootloader) sprintf(adbkey, "/%s/", key); sprintf(command, "awk.exe -F\":\" \"%s { print $2 }\" &lt; %s", ((bootloader)?key:adbkey), file); printf("%s\n", command); char *pointer = exe(command); if(!bootloader) { pointer += 2; pointer[strlen(pointer)-3] = 0; } return pointer; } char *exe(char *exe) { char buffer[1024]; FILE *f; printf("debug %s\n", exe); f = _popen(exe, "r"); printf("debug\n"); char *res = NULL; printf("debug\n"); if (f == NULL) { printf("[-] Failed to run command\n" ); return NULL; } printf("debug\n"); while (fgets(buffer, sizeof(buffer), f) != NULL) { if(res == NULL) {res = malloc(strlen(buffer) * sizeof(char)); strcpy(res, buffer);} else {res = realloc(res, strlen(res) * sizeof(char) + sizeof(buffer));sprintf(res, "%s%s", res, buffer);} } printf("debug\n"); _pclose(f); return res; } </code></pre> <p>NOTE : If I directly call <code>exe()</code> in the main with the same string supplied _popen doesn't crash.</p> <p>NOTE 2 : Debugger says <code>"warning: HEAP[program.exe]: warning: Heap block at 002D2EC0 modified at 002D2EC9 past requested size of 1"</code></p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload