- strncpy(ptr+1, fwd, sizeof(cfg.portfwd) - i);
- q = strchr(ptr, ':');
- if (q) *q = '\t'; /* replace first : with \t */
- cfg.portfwd[sizeof(cfg.portfwd) - 1] = '\0';
- cfg.portfwd[sizeof(cfg.portfwd) - 2] = '\0';
+ strncpy(ptr+1, fwd, sizeof(cfg->portfwd) - i);
+ if (!dynamic) {
+ /*
+ * We expect _at least_ two colons in this string. The
+ * possible formats are `sourceport:desthost:destport',
+ * or `sourceip:sourceport:desthost:destport' if you're
+ * specifying a particular loopback address. We need to
+ * replace the one between source and dest with a \t;
+ * this means we must find the second-to-last colon in
+ * the string.
+ */
+ q = qq = strchr(ptr, ':');
+ while (qq) {
+ char *qqq = strchr(qq+1, ':');
+ if (qqq)
+ q = qq;
+ qq = qqq;
+ }
+ if (q) *q = '\t'; /* replace second-last colon with \t */
+ }
+ cfg->portfwd[sizeof(cfg->portfwd) - 1] = '\0';
+ cfg->portfwd[sizeof(cfg->portfwd) - 2] = '\0';