/
writefree.c
59 lines (54 loc) · 1.27 KB
/
writefree.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// gcc writefree.c -o writefree -fpie -fcf-protection=none
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void readline(char *buf, int size)
{
for (int i=0; i<size-1; i++)
{
if (read(0, buf+i, 1)!=1)
_exit(0);
if (buf[i]=='\n')
{
buf[i] = '\0';
return;
}
}
buf[size-1] = '\0';
}
int variable(char vc)
{
int vi = vc-'A';
if (vi<0 || 26<=vi)
_exit(0);
return vi;
}
int main()
{
char *v[26] = {};
char buf[32];
alarm(60);
for (;;) {
readline(buf, sizeof buf);
if (strncmp(buf+1, "=malloc(", 8)==0) {
int size = atoi(buf+9);
if (size<=0 || 65536<size)
break;
v[variable(buf[0])] = malloc(size);
} else if (strncmp(buf, "free(", 5)==0) {
int t = variable(buf[5]);
free(v[t]);
v[t] = NULL;
} else if (strncmp(buf+1, "=read(", 6)==0) {
int size = atoi(buf+7);
if (size<=0 || 65536<size)
break;
if (v[variable(buf[0])]==NULL)
break;
read(0, v[variable(buf[0])], size);
} else if (strncmp(buf, "exit(", 5)==0) {
break;
}
}
_exit(0);
}