util.c (2301B)
1#include "util.h" 2 3void* 4checkp(void *p) 5{ 6 if (!p) die("pointer assertion failed, OOM?\n"); 7 return p; 8} 9 10void* 11die(const char *fmtstr, ...) 12{ 13 va_list ap; 14 15 va_start(ap, fmtstr); 16 vfprintf(stderr, fmtstr, ap); 17 va_end(ap); 18 19 exit(EXIT_FAILURE); 20} 21 22char* 23aprintf(const char *fmtstr, ...) 24{ 25 va_list ap, cpy; 26 size_t nb; 27 char *str; 28 29 va_copy(cpy, ap); 30 31 va_start(cpy, fmtstr); 32 nb = vsnprintf(NULL, 0, fmtstr, cpy); 33 va_end(cpy); 34 35 if (nb < 0) die("Invalid fmtstr!\n"); 36 str = checkp(malloc(nb+1)); 37 38 va_start(ap, fmtstr); 39 nb = vsnprintf(str, nb+1, fmtstr, ap); 40 va_end(ap); 41 42 return str; 43} 44 45const char* 46mhash(const char *str, int len) 47{ 48 static char buf[MHASHLEN + 1]; 49 int i, k, v; 50 char c, *bp; 51 52 /* VULN #2: BUFFER OVERFLOW */ 53 /* see documentation/README.md for more details */ 54 55 if (!str || !*str) str = "."; 56 if (len == -1) len = strlen(str); 57 58 for (v = 0, i = 0; i < len; i++) v += str[i]; 59 60 srand(v); 61 for (bp = buf, i = 0; i < MHASHLEN / 2; i++) 62 bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256)); 63 64 return buf; 65} 66 67int 68checkalph(const char *str, const char *alph) 69{ 70 const char *c; 71 72 for (c = str; *c; c++) 73 if (!strchr(alph, *c)) return FAIL; 74 75 return OK; 76} 77 78void 79freadstr(FILE *f, char **dst) 80{ 81 size_t start, len, tmp; 82 char c; 83 84 /* VULN #1: BAD CAST */ 85 /* see documentation/README.md for more details */ 86 87 start = ftell(f); 88 for (len = 0; (c = fgetc(f)) != EOF && c; len++); 89 fseek(f, start, SEEK_SET); 90 91 *dst = checkp(calloc(1, len + 1)); 92 tmp = fread(*dst, len, 1, f); 93 fgetc(f); 94} 95 96void 97fputstr(FILE *f, char *s) 98{ 99 fprintf(f, "%s", s); 100 fputc(0, f); 101} 102 103const char* 104ask(const char *fmtstr, ...) 105{ 106 static char linebuf[256]; 107 va_list ap; 108 int fail; 109 110 va_start(ap, fmtstr); 111 vprintf(fmtstr, ap); 112 va_end(ap); 113 114 fail = !fgets(linebuf, sizeof(linebuf), stdin); 115 116 if (!fail && *linebuf) { 117 if (linebuf[strlen(linebuf)-1] == '\n') 118 linebuf[strlen(linebuf)-1] = '\0'; 119 if (echo) printf("%s\n", linebuf); 120 } 121 122 if (fail) errno = EBADMSG; 123 124 return fail ? "" : linebuf; 125} 126 127void 128dump(const char *filename) 129{ 130 char buf[256]; 131 FILE *f; 132 int nb; 133 134 if (!(f = fopen(filename, "r"))) return; 135 136 while ((nb = fread(buf, 1, sizeof(buf) - 1, f))) 137 printf("%.*s", nb, buf); 138 139 fclose(f); 140} 141 142int 143strpfcmp(const char *prefix, const char *str) 144{ 145 return strncmp(prefix, str, strlen(prefix)); 146}