bug69316.phpt 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. --TEST--
  2. Bug #69316: Use-after-free in php_curl related to CURLOPT_FILE/_INFILE/_WRITEHEADER
  3. --EXTENSIONS--
  4. curl
  5. --FILE--
  6. <?php
  7. function hdr_callback($ch, $data) {
  8. // close the stream, causing the FILE structure to be free()'d
  9. if($GLOBALS['f_file']) {
  10. fclose($GLOBALS['f_file']); $GLOBALS['f_file'] = 0;
  11. // cause an allocation of approx the same size as a FILE structure, size varies a bit depending on platform/libc
  12. $FILE_size = (PHP_INT_SIZE == 4 ? 0x160 : 0x238);
  13. curl_setopt($ch, CURLOPT_COOKIE, str_repeat("a", $FILE_size - 1));
  14. }
  15. return strlen($data);
  16. }
  17. include 'server.inc';
  18. $host = curl_cli_server_start();
  19. $temp_file = __DIR__ . '/body.tmp';
  20. $url = "{$host}/get.inc?test=getpost";
  21. $ch = curl_init();
  22. $f_file = fopen($temp_file, "w") or die("failed to open file\n");
  23. curl_setopt($ch, CURLOPT_BUFFERSIZE, 10);
  24. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "hdr_callback");
  25. curl_setopt($ch, CURLOPT_FILE, $f_file);
  26. curl_setopt($ch, CURLOPT_URL, $url);
  27. curl_exec($ch);
  28. curl_close($ch);
  29. ?>
  30. --CLEAN--
  31. <?php
  32. unlink(__DIR__ . '/body.tmp');
  33. ?>
  34. --EXPECTF--
  35. Warning: curl_exec(): CURLOPT_FILE resource has gone away, resetting to default in %s on line %d
  36. array(1) {
  37. ["test"]=>
  38. string(7) "getpost"
  39. }
  40. array(0) {
  41. }