enowars5-service-stldoctor

STL-Analyzing A/D Service for ENOWARS5 in 2021
git clone https://git.sinitax.com/sinitax/enowars5-service-stldoctor
Log | Files | Refs | README | LICENSE | sfeed.txt

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}