A pane can potentially have up to INT_MAX lines of history (limited via "history-limit"), but "capture-pane" only accepts values down to SHRT_MIN for its "-E" and "-S" options.
To allow it to capture a pane's full history, negative numbers down to at least -INT_MAX should be accepted for these options. Technical users might try to use INT_MIN, so we should accept that too. Ideally, we should use MIN(INT_MIN, -INT_MAX), but INT_MIN is less than -INT_MAX on most platforms, so it should suffice. The existing code already handles "below zero" unsigned overflow situations. The upper bound on the specified line number remains unchanged at SHRT_MAX. Technically, a pane's height (gd->sy) could possibly be up to USHRT_MAX (from TIOCGWINSZ, winsize.ws_row is usually "unsigned short" or "new-session -dy N", where N is limited to USHRT_MAX), but allowing line specifications that high would open up the possibility of integer overflow on a platform where USHRT_MAX equals UINT_MAX. Realistically, it seems highly unlikely that any terminal emulators allow heights even close to the smallest conforming SHRT_MAX (much less USHRT_MAX, whether it equals UINT_MAX or not), so SHRT_MAX is probably an acceptable upper limit. --- I found this issue while attempting to capture all of a pane's history and its currently displayed lines (generically, without knowledge of the pane's effective hlimit), by trying to use -1000000 as a sufficiently large, negative value with "-S". The result was that that it only captured the displayed lines (the default, since strtonum reported ERANGE). I had to back down to -32768 to make it work. I am not sure how many users ever actually put "history-limit" anywhere between SHRT_MAX and INT_MAX, but it seemed like a minor bug not to support such configurations. --- trunk/cmd-capture-pane.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/cmd-capture-pane.c b/trunk/cmd-capture-pane.c index 9f2d792..52fc792 100644 --- a/trunk/cmd-capture-pane.c +++ b/trunk/cmd-capture-pane.c @@ -59,7 +59,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) buf = NULL; len = 0; - n = args_strtonum(args, 'S', SHRT_MIN, SHRT_MAX, &cause); + n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause); if (cause != NULL) { top = gd->hsize; xfree(cause); @@ -70,7 +70,7 @@ cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) if (top > gd->hsize + gd->sy - 1) top = gd->hsize + gd->sy - 1; - n = args_strtonum(args, 'E', SHRT_MIN, SHRT_MAX, &cause); + n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause); if (cause != NULL) { bottom = gd->hsize + gd->sy - 1; xfree(cause); -- 1.7.7.4 ------------------------------------------------------------------------------ Write once. Port to many. Get the SDK and tools to simplify cross-platform app development. Create new or port existing apps to sell to consumers worldwide. Explore the Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join http://p.sf.net/sfu/intel-appdev _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users