[php-src] Issue #8182: The current() method of SplFileObject has a very low probability of not returning complete data

From: Date: Thu, 10 Mar 2022 13:42:22 +0000
Subject: [php-src] Issue #8182: The current() method of SplFileObject has a very low probability of not returning complete data
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-240288@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/8182 Comment Author: cmb69 Thanks for the reproduce scripts! Running both write.php and read.php in parallel, I don't get any mismatches with latest PHP-8.0 on Windows, though. However, I can imagine what's happening in your case: only part of a line is written to the file, and then read.php skips that part, reading only the rest of the line. You can likely reproduce this with the following write.php: ````.php <?php $str = 'W2zIwMjItMDMtMDYgMTE6MzM6MzhdIHJlc3BvbnNlLkRFQlVHOiA3L5jMxIHsiaXAiOiIyMjMuMTUyLjEzNC4zMyIsImhvc3QiOiJhcGkyLnNka25leHQuY29tIiwiYXV0aCI6IjQyODA5YWU2NDgzMWEyMjUwNWI4MGZiZDk4YjRkMTY1IiwiY29kZSI6IiIsInZhbGlkIjoiIiwicGF0aCI6Ii9sb2cvb25saW5lIiwibWV0aG9kIjoiUE9TVCIsImJvZHkiOiJ7XCJhY2Nlc3NfdG9rZW5cIjpcImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSlNVekkxTmlKOS5leUpwYzE5MGFHbHlaQ0k2ZEhKMVpTd2lhWE5mYldGeVoybHVJanBtWVd4elpTd2lZWEJ3WDJsa0lqbzFNamN3Tml3aWFuVnVhVzl5WDJsa0lqbzRNRGNzSW1sa0lqb3dMQ0oxYzJWeVgybGtJam9pVFVSR1FVMVVRVEJOZW1ONlQwUk5NMUZFYXpCT1IxVjZUMWRWZUZwRVl6UlBWRlV5VG1wbk5WbHFUVEpaZW1NeFQwUlplVTU2YkcxWmFsRjZVVVJSTkU1RVdUQk9SMFV5V21wQmVFMXRWVEpQUjFrMVRucGpNazFVVm0xYVZFSnNUMVJKTUU1NldUSk5WRTVxVFVSWk1VMVhSWGhhVkZreldXMU5lVTU2WnpOWmFrRXpXVzFLYVdFaUxDSjFibWx4ZFdWZmFXUWlPaUk0TURkZlRVUkdRVTFVUVRCTmVtTjZUMFJOTTFGRWF6Qk9SMVY2VDFkVmVGcEVZelJQVkZVeVRtcG5OVmxxVFRKWmVtTXhUMFJaZVU1NmJHMVphbEY2VVVSUk5FNUVXVEJPUjBVeVdtcEJlRTF0VlRKUFIxazFUbnBqTWsxVVZtMWFWRUpzVDFSSk1FNTZXVEpOVkU1cVRVUlpNVTFYUlhoYVZGa3pXVzFOZVU1Nlp6Tlpha0V6V1cxS2FXRWlMQ0owZVhCbElqb2lkRzlyWlc0aUxDSmpjbVZoZEdWa1gyRjBJam94TmpRMk5UTTJOalUzTENKbGVIQWlPakUyTkRreE1qZzJOVGQ5LnNCM1VGd2VNdTVnRUEyZ29Cd1E4cFR1dWpkRGFQVEtLM0pQY3puUURhNkFUSHM1RlFtV0Z3a01USENJSHI4UVdGdWNxcHdVVmRTUXltU01EZ0R4bTlYb2RNemI5YXFGdDRiZTNFa3VtLXAtR1VPLTlxall5MmNvUFpxdWk0eERXXzJKVU85TXF0X2E2WklpUHFnd05RRHhDQUxaYkIxVFpnbVZtLS1vcWpiSVwiLFwiY2VydGlmaWNhdGlvbl9waVwiOlwiXCIsXCJjZXJ0aWZpY2F0aW9uX3N0YXR1c1wiOjIsXCJpbnRlcnZhbFwiOjEyMCxcInNpXCI6XCJiYmMzZTY1ZDU0OTkyMDIzODEwOGE1YTE1Njg3MDBmYlwifSIsInJldCI6MjAwLCJkYXRhIjp7InBvcG92ZXIiOnsidGl0bGUiOiIiLCJjb250ZW50IjoiIiwibGltaXQiOjF9fSwibXNnIjoiIiwiaGVhZGVyIjpudWxsLCJwb3BvdmVyIjoiIiwiY2xpZW50Ijp7ImFwcGlkIjo1MjcwNiwiY2xpZW50aWQiOiJhODAxZWRiMjU3MzE4NzNlNWFhMjRiNzU4MWE1MDE0MyIsIm9zIjoiMiIsInNka3ZlcnNpb24iOiI2LjEuMC4zMDEiLCJhZGlkIjoiNDc4NTI5IiwibWlkZGxld2FyZXZlcnNpb24iOiIxLjMuOS4wMjI1IiwidGltZXN0YW1wIjoxNjQ2NTM3NjE4LCJwYWNrYWdlbmFtZSI6ImNvbS5qdW5oYWkueXpqcS5odWF3ZWkiLCJicmFuZCI6IkhVQVdFSSIsImRldmljZW5hbWUiOiJIVUFXRUkgU0NNLVcwOSIsInN5c3RlbXZlcnNpb24iOiIxMCIsImFwcHZlcnNpb24iOjU0MTAwMCwic2NyZWVuc2l6ZSI6IjIyNDB8MTQwMCIsIm9wIjpudWxsLCJuZXQiOjEsInduIjoiIiwidWEiOiJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFNDTS1XMDkgQnVpbGQvSFVBV0VJU0NNLVcwOTsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS84OC4wLjQzMjQuOTMgU2FmYXJpLzUzNy4zNiIsImVtdWxhdG9yIjoiMCIsImlkZnYiOiIiLCJhbmRyb2lkaWQiOiI0YzVmZmNhNDQ4ZWMyZmQxIiwiaW1laSI6IlVOS05PV04iLCJvYWlkIjoiIiwidmFpZCI6IiIsImFhaWQiOiIiLCJ1ZGlkIjoiN2YxY2EyNjg2MWNhMWZlYzJmNjliZGU3N2QzYTFmMjkwIiwiY3B1X21vZGVsIjoiIHZlbmRvciBLaXJpbjk4MCIsImNwdV9hbW91bnQiOiI4Iiwicm9tX3NpemUiOiI1NEdCIiwicmFtX3NpemUiOiIzR0IifSwicGlkIjo1MjIxNSwiYXBwX2lkIjo1MjcwNiwianVuaW9yX2lkIjo4MDcsImFkX2lkIjo0N2zg1MjksImFjY291bnRfaWQiOjc2NTAsImNoYW5uZWxfaWQiOjIxMTgsIm9zIjoiMiIsInVuaXF1ZV9pZCI6IjgwN19NREZBTVRBME16Y3pPRE0zUURrME5HVXpPV1V4WkRjNE9UVTJOamc1WWpNMll6YzFPRFl5TnpsbVlqUXpRRFE0TkRZME5HRTJaakF4TW1VMk9HWTVOemMyTVRWbVpUQmxPVEkwTnpZMk1UTmpNRFkxTVdFeFpUWTNZbU15TnpnM1lqQTNZbUppYSIsInRva2VuIjp7ImlzX3RoaXJkIjp0cnVlLCJ1bmlxdWVfaWQiOiI4MDdfTURGQU1UQTBNemN6T0RNM1FEazBOR1V6T1dVeFpEYzRPVFUyTmpnNVlqTTJZemMxT0RZeU56bG1ZalF6UURRNE5EWTBOR0UyWmpBeE1tVTJPR1k1TnpjMk1UVm1aVEJsT1RJME56WTJNVE5qTURZMU1XRXhaVFkzWW1NeU56ZzNZakEzWW1KaWEiLCJpZCI6MCwidXNlcl9pZCI6Ik1ERkFNVEEwTXpjek9ETTNRRGswTkdVek9XVXhaRGM0T1RVMk5qZzVZak0yWXpjMU9EWXlOemxtWWpRelFEUTRORFkwTkdFMlpqQXhNbVUyT0dZNU56YzJNVFZtWlRCbE9USTBOelkyTVROak1EWTFNV0V4WlRZM1ltTXlOemczWWpBM1ltSmlhIiwiYXBwX2lkIjo1MjcwNiwianVuaW9yX2lkIjo4MDcsInR5cGUiOiJ0b2tlbiJ9LCJvcmRlciI6eyJvcmRlcl9ubyI6IiIsIm91dF90cmFkZV9ubyI6IiIsInRvdGFsX2ZlZSI6MCwicm9sZV9pZCI6MCwicm9sZV9uYW1lIjowfX0gW11'; $file = __DIR__ . '/gh8182.log'; if(file_exists($file)) unlink($file); touch($file); sleep(5); for ($i = 0; $i <= 2000000; $i++){ if($i % 100000 == 0) echo "$i\n"; file_put_contents($file, substr($str, 0, 1000), FILE_APPEND); sleep(5); file_put_contents($file, substr($str, 1000) . PHP_EOL, FILE_APPEND); } ```` The problem is that SplFileObject::fseek() frees the already read line, and then positions to the place where it stopped reading (not at the beginning of that line). The following SplFileObject::current() then only sees the rest of the line, resulting in the reported behavior. I don't think this qualifies as bug in PHP; instead you need to cater to that behavior in your script.

« previous php.bugs (#240288) next »