bug41125.phpt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. --TEST--
  2. Bug #41125 (PDO mysql + quote() + prepare() can result in seg fault)
  3. --SKIPIF--
  4. <?php
  5. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
  6. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  7. MySQLPDOTest::skip();
  8. ?>
  9. --FILE--
  10. <?php
  11. require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  12. $db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
  13. $search = "o'";
  14. $sql = "SELECT 1 FROM DUAL WHERE 'o''riley' LIKE " . $db->quote('%' . $search . '%');
  15. $stmt = $db->prepare($sql);
  16. $stmt->execute();
  17. print implode(' - ', (($r = @$stmt->fetch(PDO::FETCH_NUM)) ? $r : array())) ."\n";
  18. print implode(' - ', $stmt->errorinfo()) ."\n";
  19. print "-------------------------------------------------------\n";
  20. $queries = array(
  21. "SELECT 1 FROM DUAL WHERE 1 = '?\'\''",
  22. "SELECT 'a\\'0' FROM DUAL WHERE 1 = ?",
  23. "SELECT 'a', 'b\'' FROM DUAL WHERE '''' LIKE '\\'' AND ?",
  24. "SELECT 'foo?bar', '', '''' FROM DUAL WHERE ?"
  25. );
  26. foreach ($queries as $k => $query) {
  27. $stmt = $db->prepare($query);
  28. $stmt->execute(array(1));
  29. printf("[%d] Query: [[%s]]\n", $k + 1, $query);
  30. print implode(' - ', (($r = @$stmt->fetch(PDO::FETCH_NUM)) ? $r : array())) ."\n";
  31. print implode(' - ', $stmt->errorinfo()) ."\n";
  32. print "--------\n";
  33. }
  34. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
  35. $sql = "SELECT upper(:id) FROM DUAL WHERE '1'";
  36. $stmt = $db->prepare($sql);
  37. $id = 'o\'\0';
  38. $stmt->bindParam(':id', $id);
  39. $stmt->execute();
  40. printf("Query: [[%s]]\n", $sql);
  41. print implode(' - ', (($r = @$stmt->fetch(PDO::FETCH_NUM)) ? $r : array())) ."\n";
  42. print implode(' - ', $stmt->errorinfo()) ."\n";
  43. print "-------------------------------------------------------\n";
  44. $queries = array(
  45. "SELECT 1, 'foo' FROM DUAL WHERE 1 = :id AND '\\0' IS NULL AND 2 <> :id",
  46. "SELECT 1 FROM DUAL WHERE 1 = :id AND '' AND 2 <> :id",
  47. "SELECT 1 FROM DUAL WHERE 1 = :id AND '\'\'' = '''' AND 2 <> :id",
  48. "SELECT 1 FROM DUAL WHERE 1 = :id AND '\'' = '''' AND 2 <> :id",
  49. "SELECT 'a', 'b\'' FROM DUAL WHERE '''' LIKE '\\'' AND 1",
  50. "SELECT 'a''', '\'b\'' FROM DUAL WHERE '''' LIKE '\\'' AND 1",
  51. "SELECT UPPER(:id) FROM DUAL WHERE '1'",
  52. "SELECT 1 FROM DUAL WHERE '\''",
  53. "SELECT 1 FROM DUAL WHERE :id AND '\\0' OR :id",
  54. "SELECT 1 FROM DUAL WHERE 'a\\f\\n\\0' AND 1 >= :id",
  55. "SELECT 1 FROM DUAL WHERE '\'' = ''''",
  56. "SELECT '\\n' '1 FROM DUAL WHERE '''' and :id'",
  57. "SELECT 1 'FROM DUAL WHERE :id AND '''' = '''' OR 1 = 1 AND ':id",
  58. );
  59. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
  60. $id = 1;
  61. foreach ($queries as $k => $query) {
  62. $stmt = $db->prepare($query);
  63. $stmt->bindParam(':id', $id);
  64. $stmt->execute();
  65. printf("[%d] Query: [[%s]]\n", $k + 1, $query);
  66. print implode(' - ', (($r = @$stmt->fetch(PDO::FETCH_NUM)) ? $r : array())) ."\n";
  67. print implode(' - ', $stmt->errorinfo()) ."\n";
  68. print "--------\n";
  69. }
  70. ?>
  71. --EXPECT--
  72. 1
  73. 00000 - -
  74. -------------------------------------------------------
  75. [1] Query: [[SELECT 1 FROM DUAL WHERE 1 = '?\'\'']]
  76. 00000 - -
  77. --------
  78. [2] Query: [[SELECT 'a\'0' FROM DUAL WHERE 1 = ?]]
  79. a'0
  80. 00000 - -
  81. --------
  82. [3] Query: [[SELECT 'a', 'b\'' FROM DUAL WHERE '''' LIKE '\'' AND ?]]
  83. a - b'
  84. 00000 - -
  85. --------
  86. [4] Query: [[SELECT 'foo?bar', '', '''' FROM DUAL WHERE ?]]
  87. foo?bar - - '
  88. 00000 - -
  89. --------
  90. Query: [[SELECT upper(:id) FROM DUAL WHERE '1']]
  91. O'\0
  92. 00000 - -
  93. -------------------------------------------------------
  94. [1] Query: [[SELECT 1, 'foo' FROM DUAL WHERE 1 = :id AND '\0' IS NULL AND 2 <> :id]]
  95. 00000 - -
  96. --------
  97. [2] Query: [[SELECT 1 FROM DUAL WHERE 1 = :id AND '' AND 2 <> :id]]
  98. 00000 - -
  99. --------
  100. [3] Query: [[SELECT 1 FROM DUAL WHERE 1 = :id AND '\'\'' = '''' AND 2 <> :id]]
  101. 00000 - -
  102. --------
  103. [4] Query: [[SELECT 1 FROM DUAL WHERE 1 = :id AND '\'' = '''' AND 2 <> :id]]
  104. 1
  105. 00000 - -
  106. --------
  107. [5] Query: [[SELECT 'a', 'b\'' FROM DUAL WHERE '''' LIKE '\'' AND 1]]
  108. a - b'
  109. 00000 - -
  110. --------
  111. [6] Query: [[SELECT 'a''', '\'b\'' FROM DUAL WHERE '''' LIKE '\'' AND 1]]
  112. a' - 'b'
  113. 00000 - -
  114. --------
  115. [7] Query: [[SELECT UPPER(:id) FROM DUAL WHERE '1']]
  116. 1
  117. 00000 - -
  118. --------
  119. [8] Query: [[SELECT 1 FROM DUAL WHERE '\'']]
  120. 00000 - -
  121. --------
  122. [9] Query: [[SELECT 1 FROM DUAL WHERE :id AND '\0' OR :id]]
  123. 1
  124. 00000 - -
  125. --------
  126. [10] Query: [[SELECT 1 FROM DUAL WHERE 'a\f\n\0' AND 1 >= :id]]
  127. 00000 - -
  128. --------
  129. [11] Query: [[SELECT 1 FROM DUAL WHERE '\'' = '''']]
  130. 1
  131. 00000 - -
  132. --------
  133. [12] Query: [[SELECT '\n' '1 FROM DUAL WHERE '''' and :id']]
  134. 1 FROM DUAL WHERE '' and :id
  135. 00000 - -
  136. --------
  137. [13] Query: [[SELECT 1 'FROM DUAL WHERE :id AND '''' = '''' OR 1 = 1 AND ':id]]
  138. 1
  139. 00000 - -
  140. --------