diff --git a/ext/standard/file.c b/ext/standard/file.c
index 457f1f24752..a9a6acd07c0 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1196,6 +1196,11 @@ PHPAPI PHP_FUNCTION(fgetss)
php_stream_from_zval(stream, &zstream);
+ if (length > 0) {
+ /* For BC reasons, fgetss() should only return length-1 bytes. */
+ length--;
+ }
+
if (stream->readbuf_type == IS_UNICODE) {
UChar *buf = php_stream_get_line_ex(stream, IS_UNICODE, NULL_ZSTR, 0, length, &retlen);
UChar *allowed = NULL;
diff --git a/ext/standard/tests/file/fgetss.phpt b/ext/standard/tests/file/fgetss.phpt
new file mode 100644
index 00000000000..b4ac21167b1
--- /dev/null
+++ b/ext/standard/tests/file/fgetss.phpt
@@ -0,0 +1,83 @@
+--TEST--
+fgetss() tests
+--FILE--
+aaaaaa\ndddddd",
+ "asdqw\naaaa<>qqqq",
+ "aaaqqq",
+ "asdasdblah",
+ "some another text <> hoho >"
+ );
+
+foreach ($array as $str) {
+ file_put_contents($filename, $str);
+ $fp = fopen($filename, "r");
+ var_dump(fgetss($fp));
+ var_dump(fgetss($fp));
+}
+
+foreach ($array as $str) {
+ file_put_contents($filename, $str);
+ $fp = fopen($filename, "r");
+ var_dump(fgetss($fp, 10));
+ var_dump(fgetss($fp, 10));
+}
+
+var_dump(fgetss($fp, -10));
+var_dump(fgetss($fp, 0));
+fclose($fp);
+var_dump(fgetss($fp, 0));
+
+@unlink($filename);
+
+echo "Done\n";
+?>
+--EXPECTF--
+string(18) "askasdfasdfaaaaaa
+"
+string(6) "dddddd"
+string(6) "asdqw
+"
+string(8) "aaaaqqqq"
+string(23) "aaafunction foo() {}qqq"
+bool(false)
+string(6) "asdasd"
+string(0) ""
+bool(false)
+bool(false)
+string(11) "some text
+"
+string(4) "blah"
+string(24) "some another text hoho "
+bool(false)
+string(9) "askasdfas"
+string(6) "dfaaaa"
+string(5) "asdqw"
+string(0) ""
+string(3) "aaa"
+string(7) "functio"
+string(6) "asdasd"
+string(0) ""
+bool(false)
+bool(false)
+string(9) "some text"
+string(2) "
+"
+string(9) "some anot"
+string(9) "her text "
+
+Warning: fgetss(): Length parameter must be greater than 0 in %s on line %d
+bool(false)
+
+Warning: fgetss(): Length parameter must be greater than 0 in %s on line %d
+bool(false)
+
+Warning: fgetss(): %d is not a valid stream resource in %s on line %d
+bool(false)
+Done
diff --git a/ext/standard/tests/file/fgetss1.phpt b/ext/standard/tests/file/fgetss1.phpt
new file mode 100644
index 00000000000..96b8b6f5328
--- /dev/null
+++ b/ext/standard/tests/file/fgetss1.phpt
@@ -0,0 +1,69 @@
+--TEST--
+more fgetss() tests
+--FILE--
+aaaaaa\ndddddd",
+ "asdqw\naaaa<>qqqq",
+ "aaaqqq",
+ "asdasdblah",
+ "some another text <> hoho >"
+ );
+
+foreach ($array as $str) {
+ file_put_contents($filename, $str);
+ $fp = fopen($filename, "r");
+ var_dump(fgetss($fp, 1000, ",,"));
+ var_dump(fgetss($fp));
+}
+
+foreach ($array as $str) {
+ file_put_contents($filename, $str);
+ $fp = fopen($filename, "r");
+ var_dump(fgetss($fp, 10));
+ var_dump(fgetss($fp, 10, "