Member 13536260 Ответов: 1

Это переполнение буфера node.js-что?


Мой серверный код: [node.js]
var net = require("net");
console.log("waiting");
var server = net.createServer(function(socket){
	socket.on("data", function(d){
		console.log("[*] we are taliking to somebody");
		console.log("[*] data")
		console.log(d);
		var buf = new Buffer(10);
		d.copy(buf);
		console.log("[*] buffer:")
		console.log(buf);
		console.log(" ");
		socket.write("Server !O! is online!");
	});
});
server.listen(1111, '127.0.0.1');


мой клиентский код: [python]
import socket

buffer = "\x41"* 3000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 1111))

sock.send(buffer)
print sock.recv(40)
sock.close()


затем сервер печатает:
waiting
[*] we are talking to somebody
[*] data
<Buffer 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 ...>
[*] buffer 
<Buffer 41 41 41 41 41 41 41 41 41 41>


Я просто не думаю, что это правильно.

Что я уже пробовал:

Я не знаю, что с этим делать, но ... node.js не разбивается

1 Ответов

Рейтинг:
2

Patrice T

С чего бы ему переливаться через край?

d.copy(buf);

Это копирование d к buf до тех пор buf преисполненный.
node.js управляется ли память, она знает размер buf и таким образом он знает, что он должен остановиться, когда buf преисполненный.


Member 13536260

Да, но не стоит node.js предупредить кого-нибудь, что "d" слишком много, чтобы его можно было скопировать на очень маленький буфер "buf"?

Patrice T

Почему?
Он ожидает, что программист (вы) будет знать, что он делает.
Вы явно говорите, что хотите скопировать большую строку в буфер фиксированного размера, зачем вам нужно предупреждение только для того, чтобы сделать то, что вы просили?