=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/format.c,v retrieving revision 1.104 retrieving revision 1.105 diff -c -r1.104 -r1.105 *** src/usr.bin/tmux/format.c 2016/01/19 15:59:12 1.104 --- src/usr.bin/tmux/format.c 2016/01/31 09:54:46 1.105 *************** *** 1,4 **** ! /* $OpenBSD: format.c,v 1.104 2016/01/19 15:59:12 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: format.c,v 1.105 2016/01/31 09:54:46 nicm Exp $ */ /* * Copyright (c) 2011 Nicholas Marriott *************** *** 684,690 **** char *copy, *copy0, *endptr, *ptr, *found, *new, *value; char *from = NULL, *to = NULL; size_t valuelen, newlen, fromlen, tolen, used; ! u_long limit = 0; int modifiers = 0, brackets; /* Make a copy of the key. */ --- 684,690 ---- char *copy, *copy0, *endptr, *ptr, *found, *new, *value; char *from = NULL, *to = NULL; size_t valuelen, newlen, fromlen, tolen, used; ! long limit = 0; int modifiers = 0, brackets; /* Make a copy of the key. */ *************** *** 696,703 **** switch (copy[0]) { case '=': errno = 0; ! limit = strtoul(copy + 1, &endptr, 10); ! if (errno == ERANGE && limit == ULONG_MAX) break; if (*endptr != ':') break; --- 696,703 ---- switch (copy[0]) { case '=': errno = 0; ! limit = strtol(copy + 1, &endptr, 10); ! if (errno == ERANGE && (limit == LONG_MIN || limit == LONG_MAX)) break; if (*endptr != ':') break; *************** *** 813,820 **** } /* Truncate the value if needed. */ ! if (limit != 0) { new = utf8_trimcstr(value, limit); free(value); value = new; } --- 813,824 ---- } /* Truncate the value if needed. */ ! if (limit > 0) { new = utf8_trimcstr(value, limit); + free(value); + value = new; + } else if (limit < 0) { + new = utf8_rtrimcstr(value, -limit); free(value); value = new; }