From: Roy Marples Date: Sun, 28 Sep 2014 20:26:49 +0000 (+0000) Subject: Some strings don't need to be shell escaped - for example when sending to X-Git-Tag: v6.5.0~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc51f492ad6372d2bddcdf3541675c3ee64d4ea0;p=thirdparty%2Fdhcpcd.git Some strings don't need to be shell escaped - for example when sending to syslog(2), so just use vis(3). --- diff --git a/compat/svis.c b/compat/svis.c index 7bd97ce2..37102d74 100644 --- a/compat/svis.c +++ b/compat/svis.c @@ -158,3 +158,10 @@ svis(char *dst, int c, int flag, int nextc, const char *extra) } return dst; } + +char * +vis(char *dst, int c, int flag, int nextc) +{ + + return svis(dst, c, flag, nextc, ""); +} diff --git a/compat/svis.h b/compat/svis.h index 982d9f29..c56306ce 100644 --- a/compat/svis.h +++ b/compat/svis.h @@ -4,6 +4,7 @@ #define VIS_OCTAL 0x0001 /* use octal \ddd format */ #define VIS_CSTYLE 0x0002 /* use \[nrft0..] where appropiate */ +char *vis(char *dst, int c, int flag, int nextc); char *svis(char *dst, int c, int flag, int nextc, const char *meta); #endif diff --git a/dhcp-common.c b/dhcp-common.c index 569766b1..c692a1ad 100644 --- a/dhcp-common.c +++ b/dhcp-common.c @@ -310,7 +310,7 @@ decode_rfc3397(char *out, size_t len, const uint8_t *p, size_t pl) * Any non visible characters are escaped as an octal number. */ ssize_t -print_string(char *s, size_t len, const uint8_t *data, size_t dl) +print_string(char *s, size_t len, int flags, const uint8_t *data, size_t dl) { uint8_t c; const uint8_t *e, *p; @@ -329,8 +329,12 @@ print_string(char *s, size_t len, const uint8_t *data, size_t dl) if (p == e) break; } - ve = svis(v, c, VIS_CSTYLE | VIS_OCTAL, - data <= e ? *data : 0, ESCAPE_CHARS); + if (flags) + ve = svis(v, c, VIS_CSTYLE | VIS_OCTAL, + data <= e ? *data : 0, ESCAPE_CHARS); + else + ve = vis(v, c, VIS_CSTYLE | VIS_OCTAL, + data <= e ? *data : 0); if (s && len < (size_t)(ve - v) + 1) { errno = ENOBUFS; return -1; @@ -426,7 +430,7 @@ print_option(char *s, size_t len, int type, const uint8_t *data, size_t dl, if (tmp == NULL) return -1; decode_rfc3397(tmp, l, data, dl); - sl = print_string(s, len, (uint8_t *)tmp, l - 1); + sl = print_string(s, len, 1, (uint8_t *)tmp, l - 1); free(tmp); return sl; } @@ -436,7 +440,7 @@ print_option(char *s, size_t len, int type, const uint8_t *data, size_t dl, if ((tmp = decode_rfc3361(data, dl)) == NULL) return -1; l = strlen(tmp); - sl = print_string(s, len, (uint8_t *)tmp, l); + sl = print_string(s, len, 1, (uint8_t *)tmp, l); free(tmp); return sl; } @@ -452,7 +456,7 @@ print_option(char *s, size_t len, int type, const uint8_t *data, size_t dl, /* Some DHCP servers return NULL strings */ if (*data == '\0') return 0; - return print_string(s, len, data, dl); + return print_string(s, len, 1, data, dl); } if (type & FLAG) { diff --git a/dhcp-common.h b/dhcp-common.h index d6b4d5ff..4b0e0feb 100644 --- a/dhcp-common.h +++ b/dhcp-common.h @@ -93,7 +93,7 @@ int make_option_mask(const struct dhcp_opt *, size_t, size_t encode_rfc1035(const char *src, uint8_t *dst); ssize_t decode_rfc3397(char *, size_t, const uint8_t *, size_t); -ssize_t print_string(char *, size_t, const uint8_t *, size_t); +ssize_t print_string(char *, size_t, int, const uint8_t *, size_t); ssize_t print_option(char *, size_t, int, const uint8_t *, size_t, const char *); diff --git a/dhcp.c b/dhcp.c index 27cc4b66..a124289d 100644 --- a/dhcp.c +++ b/dhcp.c @@ -1269,12 +1269,12 @@ dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp, } if (*dhcp->bootfile && !(overl & 1)) { - print_string(safe, sizeof(safe), + print_string(safe, sizeof(safe), 1, dhcp->bootfile, sizeof(dhcp->bootfile)); setvar(&ep, prefix, "filename", safe); } if (*dhcp->servername && !(overl & 2)) { - print_string(safe, sizeof(safe), + print_string(safe, sizeof(safe), 1, dhcp->servername, sizeof(dhcp->servername)); setvar(&ep, prefix, "server_name", safe); } @@ -2190,9 +2190,25 @@ log_dhcp1(int lvl, const char *msg, struct in_addr addr; int r; - if (strcmp(msg, "NAK:") == 0) + if (strcmp(msg, "NAK:") == 0) { a = get_option_string(iface->ctx, dhcp, DHO_MESSAGE); - else if (ad && dhcp->yiaddr != 0) { + if (a) { + char *tmp; + size_t al, tmpl; + + al = strlen(a); + tmpl = (al * 4) + 1; + tmp = malloc(tmpl); + if (tmp == NULL) { + syslog(LOG_ERR, "%s: %m", __func__); + free(a); + return; + } + print_string(tmp, tmpl, 0, (uint8_t *)a, al); + free(a); + a = tmp; + } + } else if (ad && dhcp->yiaddr != 0) { addr.s_addr = dhcp->yiaddr; a = strdup(inet_ntoa(addr)); if (a == NULL) { @@ -2205,7 +2221,7 @@ log_dhcp1(int lvl, const char *msg, tfrom = "from"; r = get_option_addr(iface->ctx, &addr, dhcp, DHO_SERVERID); if (dhcp->servername[0] && r == 0) { - print_string(sname, sizeof(sname), + print_string(sname, sizeof(sname), 0, dhcp->servername, strlen((const char *)dhcp->servername)); if (a == NULL) syslog(lvl, "%s: %s %s %s `%s'", iface->name, msg, diff --git a/dhcpcd.c b/dhcpcd.c index 240bd454..7e174cca 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -490,7 +490,9 @@ dhcpcd_selectprofile(struct interface *ifp, const char *profile) if (ifp->ssid_len) { ssize_t r; - r =print_string(pssid, sizeof(pssid), ifp->ssid, ifp->ssid_len); + + r = print_string(pssid, sizeof(pssid), 0, + ifp->ssid, ifp->ssid_len); if (r == -1) { syslog(LOG_ERR, "%s: %s: %m", ifp->name, __func__); pssid[0] = '\0'; diff --git a/ipv6nd.c b/ipv6nd.c index 794ef9dc..fbe85275 100644 --- a/ipv6nd.c +++ b/ipv6nd.c @@ -1010,11 +1010,11 @@ ipv6nd_handlera(struct ipv6_ctx *ctx, struct interface *ifp, if (tmp) { decode_rfc3397(tmp, l, op, n); l -= 1; - n = (size_t)print_string(NULL, 0, + n = (size_t)print_string(NULL, 0, 1, (const uint8_t *)tmp, l); opt = malloc(n); if (opt) - print_string(opt, n, + print_string(opt, n, 1, (const uint8_t *)tmp, l); else syslog(LOG_ERR, "%s: %m", diff --git a/script.c b/script.c index c5adb8e5..42ffd92c 100644 --- a/script.c +++ b/script.c @@ -387,12 +387,12 @@ make_env(const struct interface *ifp, const char *reason, char ***argv) ssize_t psl; pfx_len = strlen(pfx); - psl = print_string(NULL, 0, + psl = print_string(NULL, 0, 1, (const uint8_t *)ifp->ssid, ifp->ssid_len); if (psl != -1) { EMALLOC(elen, pfx_len + (size_t)psl + 1); memcpy(env[elen], pfx, pfx_len); - print_string(env[elen] + pfx_len, (size_t)psl, + print_string(env[elen] + pfx_len, (size_t)psl, 1, (const uint8_t *)ifp->ssid, ifp->ssid_len); elen++; }