For the fix, how about we just change keylen to ssize_t instead? It is a smaller and much less risky change, since it's only a local variable, and only used in one place.
Example patch:
diff --git a/src/or/rendservice.c b/src/or/rendservice.cindex ba8891eade39ea..80e1e10a054b4a 100644--- a/src/or/rendservice.c+++ b/src/or/rendservice.c@@ -1162,7 +1162,7 @@ rend_service_introduce(origin_circuit_t *circuit, const uint8_t *request, time_t now = time(NULL); time_t elapsed; int replay;- size_t keylen;+ ssize_t keylen; /* Do some initial validation and logging before we parse the cell */ if (circuit->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) {