MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add REMAIN macro and update string handling functions

+70 -15
+1
include/ant.h
··· 18 18 #define ANT_STRING(s) js_mkstr(js, s, sizeof(s) - 1) 19 19 #define ANT_PTR(ptr) js_mknum((double)(uintptr_t)(ptr)) 20 20 #define ANT_COPY(buf, len, s) cpy(buf, len, s, sizeof(s) - 1) 21 + #define REMAIN(n, len) ((n) >= (len) ? 0 : (len) - (n)) 21 22 22 23 #define JS_NAN ((double)NAN) 23 24 #define JS_NEG_NAN ((double)(-NAN))
+20 -5
src/modules/server.c
··· 603 603 free(wr); 604 604 } 605 605 606 + __attribute__((format(printf, 4, 5))) 607 + static size_t append_header(char *buf, size_t size, size_t used, const char *fmt, ...) { 608 + if (!buf || size == 0 || used >= size) return used; 609 + 610 + size_t remaining = size - used; 611 + va_list ap; 612 + va_start(ap, fmt); 613 + int written = vsnprintf(buf + used, remaining, fmt, ap); 614 + va_end(ap); 615 + 616 + if (written < 0) return used; 617 + if ((size_t)written >= remaining) return size - 1; 618 + return used + (size_t)written; 619 + } 620 + 606 621 static void send_response(uv_stream_t *client, response_ctx_t *res_ctx) { 607 622 char *body_to_send = res_ctx->body; 608 623 size_t body_len_to_send = res_ctx->body_len; ··· 627 642 } 628 643 629 644 char header[8192]; 630 - int header_len = snprintf(header, sizeof(header), 645 + size_t header_len = append_header(header, sizeof(header), 0, 631 646 "HTTP/1.1 %d %s\r\n" 632 647 "Content-Type: %s\r\n" 633 648 "Content-Length: %zu\r\n" ··· 642 657 ); 643 658 644 659 if (res_ctx->redirect_location) { 645 - header_len += snprintf(header + header_len, sizeof(header) - header_len, 660 + header_len = append_header(header, sizeof(header), header_len, 646 661 "%s\r\n", res_ctx->redirect_location); 647 662 } 648 663 ··· 650 665 custom_header_t *custom_header = NULL; 651 666 while ((custom_header = (custom_header_t*)utarray_next(res_ctx->custom_headers, custom_header))) { 652 667 if (custom_header->name && custom_header->value) { 653 - header_len += snprintf(header + header_len, sizeof(header) - header_len, 668 + header_len = append_header(header, sizeof(header), header_len, 654 669 "%s: %s\r\n", custom_header->name, custom_header->value); 655 670 } 656 671 } 657 672 } 658 673 659 - header_len += snprintf(header + header_len, sizeof(header) - header_len, 674 + header_len = append_header(header, sizeof(header), header_len, 660 675 "Connection: close\r\n\r\n"); 661 676 662 677 size_t total_len = header_len + body_len_to_send; ··· 996 1011 997 1012 void init_server_module() { 998 1013 js_set(rt->js, rt->ant_obj, "serve", js_mkfun(js_serve)); 999 - } 1014 + }
+2 -2
src/modules/uri.c
··· 96 96 if (is_lone_surrogate((unsigned char *)&str[i], seq_len)) goto malformed; 97 97 98 98 for (int j = 0; j < seq_len; j++) { 99 - out_len += sprintf(out + out_len, "%%%02X", (unsigned char)str[i + j]); 99 + out_len += (size_t)snprintf(out + out_len, out_cap - out_len, "%%%02X", (unsigned char)str[i + j]); 100 100 } 101 101 i += seq_len; 102 102 } ··· 149 149 if (is_lone_surrogate((unsigned char *)&str[i], seq_len)) goto malformed; 150 150 151 151 for (int j = 0; j < seq_len; j++) { 152 - out_len += sprintf(out + out_len, "%%%02X", (unsigned char)str[i + j]); 152 + out_len += (size_t)snprintf(out + out_len, out_cap - out_len, "%%%02X", (unsigned char)str[i + j]); 153 153 } 154 154 i += seq_len; 155 155 }
+47 -8
src/modules/url.c
··· 199 199 char *href = malloc(len); 200 200 if (!href) return NULL; 201 201 202 - char *w = href; 203 - w += sprintf(w, "%s//", protocol); 202 + size_t used = 0; 203 + size_t remaining = len; 204 + 205 + int written = snprintf(href + used, remaining, "%s//", protocol); 206 + if (written < 0) { href[0] = '\0'; return href; } 207 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 208 + used += (size_t)written; 209 + remaining -= (size_t)written; 210 + 204 211 if (username && *username) { 205 - w += sprintf(w, "%s", username); 206 - if (password && *password) w += sprintf(w, ":%s", password); 207 - w += sprintf(w, "@"); 212 + written = snprintf(href + used, remaining, "%s", username); 213 + if (written < 0) { href[0] = '\0'; return href; } 214 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 215 + used += (size_t)written; 216 + remaining -= (size_t)written; 217 + 218 + if (password && *password) { 219 + written = snprintf(href + used, remaining, ":%s", password); 220 + if (written < 0) { href[0] = '\0'; return href; } 221 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 222 + used += (size_t)written; 223 + remaining -= (size_t)written; 224 + } 225 + 226 + written = snprintf(href + used, remaining, "@"); 227 + if (written < 0) { href[0] = '\0'; return href; } 228 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 229 + used += (size_t)written; 230 + remaining -= (size_t)written; 231 + } 232 + 233 + written = snprintf(href + used, remaining, "%s", hostname); 234 + if (written < 0) { href[0] = '\0'; return href; } 235 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 236 + used += (size_t)written; 237 + remaining -= (size_t)written; 238 + 239 + if (port && *port) { 240 + written = snprintf(href + used, remaining, ":%s", port); 241 + if (written < 0) { href[0] = '\0'; return href; } 242 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 243 + used += (size_t)written; 244 + remaining -= (size_t)written; 208 245 } 209 - w += sprintf(w, "%s", hostname); 210 - if (port && *port) w += sprintf(w, ":%s", port); 211 - w += sprintf(w, "%s%s%s", pathname, search, hash); 246 + 247 + written = snprintf(href + used, remaining, "%s%s%s", pathname, search, hash); 248 + if (written < 0) { href[0] = '\0'; return href; } 249 + if ((size_t)written >= remaining) { href[len - 1] = '\0'; return href; } 250 + 212 251 return href; 213 252 } 214 253