From 0a033800b6f2c79838df82c991cead2737c5ea07 Mon Sep 17 00:00:00 2001 From: Greg Alexander Date: Fri, 10 Jun 2016 16:05:32 -0400 Subject: [PATCH] for the rsync/supersu buffering hack, limit the total buffer depth to 1MB so that it doesn't cause memory exhaustion in extreme cases --- jni/buffersu.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/jni/buffersu.c b/jni/buffersu.c index c030528..682d4a0 100644 --- a/jni/buffersu.c +++ b/jni/buffersu.c @@ -9,6 +9,7 @@ #define WRAPPED_CMD "/data/data/org.galexander.sshd/lib/librsync.so" #define WRAPPED_ARG0 "rsync" +#define MAX_BUFSZ (1024*1024) static void @@ -50,6 +51,17 @@ struct buf { struct block *tail; /* write here */ }; +static int +buf_length(struct buf *b) +{ + struct block *p; + int ret = 0; + for (p = b->head; p; p = p->next) { + ret += p->len; + } + return ret; +} + static int buf_waiting(struct buf *b) { @@ -153,8 +165,12 @@ main(int argc, char **argv) while (1) { int s; FD_ZERO(&ifds); - FD_SET(0, &ifds); - FD_SET(child_stdout, &ifds); + if (buf_length(&buf0) < MAX_BUFSZ) { + FD_SET(0, &ifds); + } + if (buf_length(&buf1) < MAX_BUFSZ) { + FD_SET(child_stdout, &ifds); + } FD_ZERO(&ofds); if (buf_waiting(&buf1)) { FD_SET(1, &ofds);