The leading checksum value of custom layout strings output by the
list-windows command (generated by layout_dump) is printed as a four
character field ("%4x"). For values less than 0x1000 this means that
spaces are added to the left side to pad it out to four characters.

These leading spaces are easy to accidentally (or unintentionally)
omit when copying the custom layout string for use with the
select-layout command.

Technically, a "short" checksum value is correctly parsed by the
current code, but the pointer is advanced as if it were always four
characters long. This effectively mangles the rest of the custom
layout string by skipping one or more of the next characters (i.e.
the width of the top-level window). This likely invalidates the
checksum, and would certainly disturb the relationship among the
widths of the panes represented by the layout string.

Advance the pointer according to the actual length of the parsed
value instead of assuming that it is four characters long.

---

For testing purposes, here are some layouts that have "short"
checksums (for two and six panes):

    75b,193x41,0,0[193x30,0,0,0,193x7,0,31,1,193x2,0,39,2]

    
94,118x40,0,0{100x40,0,0,0,17x40,101,0[17x10,101,0,3,17x9,101,11{2x9,101,11,5,11x9,104,11,8,2x9,116,11,7},17x19,101,21,4]}
---
 layout-custom.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/layout-custom.c b/layout-custom.c
index c076232..aa70e16 100644
--- a/layout-custom.c
+++ b/layout-custom.c
@@ -121,11 +121,12 @@ layout_parse(struct window *w, const char *layout)
        struct window_pane      *wp;
        u_int                    npanes, ncells, sx, sy;
        u_short                  csum;
+       int                      size;
 
        /* Check validity. */
-       if (sscanf(layout, "%hx,", &csum) != 1)
+       if (sscanf(layout, "%hx,%n", &csum, &size) != 1)
                return (-1);
-       layout += 5;
+       layout += size;
        if (csum != layout_checksum(layout))
                return (-1);
 
-- 
1.8.1.3


------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to