libstore: despecialcase protocol version check
protocol versions are sent as u64. on the peer we read them as uint64,
check that the upper half is 0, and throw an exception if not. we then
read an arbitrary amount of data from the peer and dump it to the user
terminal. this is a little bit ridiculous, can never happen in correct
implementation, and is severly untested. let us just drop it entirely.
Change-Id: Ibd2f53a765341ed6439d40d9d1eac11e79c6b5e3
This commit is contained in:
parent
3e428f2289
commit
c856b82c2e
|
@ -124,20 +124,9 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
|
||||||
conn->to << SERVE_MAGIC_1 << SERVE_PROTOCOL_VERSION;
|
conn->to << SERVE_MAGIC_1 << SERVE_PROTOCOL_VERSION;
|
||||||
conn->to.flush();
|
conn->to.flush();
|
||||||
|
|
||||||
StringSink saved;
|
uint64_t magic = readLongLong(conn->from);
|
||||||
try {
|
if (magic != SERVE_MAGIC_2)
|
||||||
TeeSource tee(conn->from, saved);
|
throw Error("'nix-store --serve' protocol mismatch from '%s'", host);
|
||||||
unsigned int magic = readInt(tee);
|
|
||||||
if (magic != SERVE_MAGIC_2)
|
|
||||||
throw Error("'nix-store --serve' protocol mismatch from '%s'", host);
|
|
||||||
} catch (SerialisationError & e) {
|
|
||||||
/* In case the other side is waiting for our input,
|
|
||||||
close it. */
|
|
||||||
conn->sshConn->in.close();
|
|
||||||
auto msg = conn->from.drain();
|
|
||||||
throw Error("'nix-store --serve' protocol mismatch from '%s', got '%s'",
|
|
||||||
host, chomp(saved.s + msg));
|
|
||||||
}
|
|
||||||
conn->remoteVersion = readInt(conn->from);
|
conn->remoteVersion = readInt(conn->from);
|
||||||
if (GET_PROTOCOL_MAJOR(conn->remoteVersion) != 0x200)
|
if (GET_PROTOCOL_MAJOR(conn->remoteVersion) != 0x200)
|
||||||
throw Error("unsupported 'nix-store --serve' protocol version on '%s'", host);
|
throw Error("unsupported 'nix-store --serve' protocol version on '%s'", host);
|
||||||
|
|
|
@ -69,19 +69,10 @@ void RemoteStore::initConnection(Connection & conn)
|
||||||
conn.from.endOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)";
|
conn.from.endOfFileError = "Nix daemon disconnected unexpectedly (maybe it crashed?)";
|
||||||
conn.to << WORKER_MAGIC_1;
|
conn.to << WORKER_MAGIC_1;
|
||||||
conn.to.flush();
|
conn.to.flush();
|
||||||
StringSink saved;
|
|
||||||
try {
|
uint64_t magic = readLongLong(conn.from);
|
||||||
TeeSource tee(conn.from, saved);
|
if (magic != WORKER_MAGIC_2)
|
||||||
unsigned int magic = readInt(tee);
|
throw Error("protocol mismatch");
|
||||||
if (magic != WORKER_MAGIC_2)
|
|
||||||
throw Error("protocol mismatch");
|
|
||||||
} catch (SerialisationError & e) {
|
|
||||||
/* In case the other side is waiting for our input, close
|
|
||||||
it. */
|
|
||||||
conn.closeWrite();
|
|
||||||
auto msg = conn.from.drain();
|
|
||||||
throw Error("protocol mismatch, got '%s'", chomp(saved.s + msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
conn.from >> conn.daemonVersion;
|
conn.from >> conn.daemonVersion;
|
||||||
if (GET_PROTOCOL_MAJOR(conn.daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION))
|
if (GET_PROTOCOL_MAJOR(conn.daemonVersion) != GET_PROTOCOL_MAJOR(PROTOCOL_VERSION))
|
||||||
|
|
Loading…
Reference in a new issue