When pane ids were added to the custom layout strings, the parsing
was adjusted to be backwards compatible. However, a bug prevents
this code from correctly parsing custom layout strings that describe
a layout with at least one split.

Here is an example new-style (with pane ids) custom layout string
for a split window (the leading checksum has been omitted):

    80x40,0,0[80x20,0,0,75,80x19,0,21,76]]
    -------------------

And the equivalent old-style string (again, without checksum):

    80x40,0,0[80x20,0,0,80x19,0,21]
    -------------------

The underlined portions of the strings are parsed correctly. In the
new-style string, the next bit of the string (",75") will be
correctly consumed as a pane id (the value itself is not used). In
the old-style string, the next bit of the string (",80") is also
consumed as a pane id, but this is an error because it is actually
the width of the next pane. The old-style string will ultimately be
rejected because the code is not expecting to see an 'x' immediately
after a pane description has ended (only a comma, brace, bracket, or
the end of the string is expected).

To decide whether the next number is a pane id or the width of the
next pane, look at the following separator (if any). If it is an
'x', then there is no pane id; let the parsing resume at the
previous comma.

---

This bug will probably bite anyone using previously extracted custom
layout strings with 1.6 when they upgrade to 1.7. A fix would
probably be appropriate for a 1.7 maintenance release, if there are
any plans for one.

For testing purposes, here is a old-style three-pane layout (it also
has a "short" checksum):

    5ff,318x64,0,0{189x64,0,0,128x64,190,0[128x32,190,0,128x31,190,33]}
---
 layout-custom.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/layout-custom.c b/layout-custom.c
index aa70e16..a386434 100644
--- a/layout-custom.c
+++ b/layout-custom.c
@@ -210,8 +210,7 @@ layout_construct(struct layout_cell *lcparent, const char 
**layout)
 
        if (!isdigit((u_char) **layout))
                return (NULL);
-       if (sscanf(*layout, "%ux%u,%u,%u,%*u", &sx, &sy, &xoff, &yoff) != 4 &&
-           sscanf(*layout, "%ux%u,%u,%u", &sx, &sy, &xoff, &yoff) != 4)
+       if (sscanf(*layout, "%ux%u,%u,%u", &sx, &sy, &xoff, &yoff) != 4)
                return (NULL);
 
        while (isdigit((u_char) **layout))
@@ -232,9 +231,12 @@ layout_construct(struct layout_cell *lcparent, const char 
**layout)
        while (isdigit((u_char) **layout))
                (*layout)++;
        if (**layout == ',') {
+               const char      *before_pane_id = *layout;
                (*layout)++;
                while (isdigit((u_char) **layout))
                        (*layout)++;
+               if (**layout == 'x')
+                       *layout = before_pane_id;
        }
 
        lc = layout_create_cell(lcparent);
-- 
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