summaryrefslogtreecommitdiff
path: root/taint.c
blob: dbb0a1e9dc82e117b8b8403ae34cc57906bdd499 (plain)
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
/*
 * "...we will have peace, when you and all your works have perished--and
 * the works of your dark master to whom you would deliver us.  You are a
 * liar, Saruman, and a corrupter of men's hearts."  --Theoden
 */

#include "EXTERN.h"
#include "perl.h"

void
taint_proper(f, s)
const char *f;
char *s;
{
    char *ug;

    if (tainted) {
	DEBUG_u(PerlIO_printf(PerlIO_stderr(),
			      "%s %d %d %d\n", s, tainted, uid, euid));
	if (euid != uid)
	    ug = " while running setuid";
	else if (egid != gid)
	    ug = " while running setgid";
	else
	    ug = " while running with -T switch";
	if (!unsafe)
	    croak(f, s, ug);
	else if (dowarn)
	    warn(f, s, ug);
    }
}

void
taint_env()
{
    SV** svp;
    MAGIC *mg = 0;

    svp = hv_fetch(GvHVn(envgv),"PATH",4,FALSE);
    if (!svp || *svp == &sv_undef ||
	((mg = mg_find(*svp, 't')) && mg->mg_len & 1))
    {
	TAINT;
	if (mg && MgTAINTEDDIR(mg))
	    taint_proper("Insecure directory in %s%s", "$ENV{PATH}");
	else
	    taint_proper("Insecure %s%s", "$ENV{PATH}");
    }

    svp = hv_fetch(GvHVn(envgv),"IFS",3,FALSE);
    if (svp && *svp != &sv_undef &&
	(mg = mg_find(*svp, 't')) && mg->mg_len & 1)
    {
	TAINT;
	taint_proper("Insecure %s%s", "$ENV{IFS}");
    }
}