Add esnprintf() and refactor some code - quark - quark web server | |
git clone git://git.suckless.org/quark | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit c8401c591fac7fd98349e05e595cdbe861998a90 | |
parent 1879e14e79aca6f676d48e58500eb755f341e78b | |
Author: Laslo Hunhold <[email protected]> | |
Date: Mon, 5 Mar 2018 00:59:37 +0100 | |
Add esnprintf() and refactor some code | |
The (size_t) discards the case where the return value of snprintf is < 0. This | |
is rather unlikely, but we'll keep it in mind anyway. | |
Diffstat: | |
M http.c | 12 ++++++------ | |
M util.c | 13 +++++++++++++ | |
M util.h | 1 + | |
3 files changed, 20 insertions(+), 6 deletions(-) | |
--- | |
diff --git a/http.c b/http.c | |
@@ -346,8 +346,8 @@ http_send_response(int fd, struct request *r) | |
/* if we have a vhost prefix, prepend it to the target */ | |
if (s.vhost[i].prefix) { | |
- if ((size_t)snprintf(realtarget, sizeof(realtarget), "… | |
- s.vhost[i].prefix, realtarget) >= sizeof(realtarge… | |
+ if (esnprintf(realtarget, sizeof(realtarget), "%s%s", | |
+ s.vhost[i].prefix, realtarget)) { | |
return http_send_status(fd, S_REQUEST_TOO_LARG… | |
} | |
} | |
@@ -363,8 +363,8 @@ http_send_response(int fd, struct request *r) | |
} | |
/* swap out target prefix */ | |
- if ((size_t)snprintf(tmptarget, sizeof(tmptarget), "%s… | |
- s.map[i].to, realtarget + len) >= sizeof(tmptarget… | |
+ if (esnprintf(tmptarget, sizeof(tmptarget), "%s%s", | |
+ s.map[i].to, realtarget + len)) { | |
return http_send_status(fd, S_REQUEST_TOO_LARG… | |
} | |
memcpy(realtarget, tmptarget, sizeof(realtarget)); | |
@@ -441,8 +441,8 @@ http_send_response(int fd, struct request *r) | |
if (S_ISDIR(st.st_mode)) { | |
/* append docindex to target */ | |
- if ((size_t)snprintf(realtarget, sizeof(realtarget), "%s%s", | |
- r->target, s.docindex) >= sizeof(realtarget)) { | |
+ if (esnprintf(realtarget, sizeof(realtarget), "%s%s", | |
+ r->target, s.docindex)) { | |
return http_send_status(fd, S_REQUEST_TOO_LARGE); | |
} | |
diff --git a/util.c b/util.c | |
@@ -61,6 +61,19 @@ timestamp(time_t t, char buf[TIMESTAMP_LEN]) | |
return buf; | |
} | |
+int | |
+esnprintf(char *str, size_t size, const char *fmt, ...) | |
+{ | |
+ va_list ap; | |
+ int ret; | |
+ | |
+ va_start(ap, fmt); | |
+ ret = vsnprintf(str, size, fmt, ap); | |
+ va_end(ap); | |
+ | |
+ return (ret < 0 || (size_t)ret >= size); | |
+} | |
+ | |
#define INVALID 1 | |
#define TOOSMALL 2 | |
#define TOOLARGE 3 | |
diff --git a/util.h b/util.h | |
@@ -49,6 +49,7 @@ void die(const char *, ...); | |
#define TIMESTAMP_LEN 30 | |
char *timestamp(time_t, char buf[TIMESTAMP_LEN]); | |
+int esnprintf(char *, size_t, const char *, ...); | |
void *reallocarray(void *, size_t, size_t); | |
long long strtonum(const char *, long long, long long, const char **); |