Toon posts:

[C-linux] na seteuid() een EACCES error bij open()

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een webserver, als oefening om beter te leren programmeren.
Omdat het programma als root gestart moet worden (om rechten te hebben tot poort 80) worden alle permissies die bepaalde bestanden hebben genegeerd. Immers, root kan al jouw files lezen.

Om dit probleem op te losse wilde ik gebruik maken van seteuid(euid). Maar als ik dit in mijn code toevoeg kan het programma geen bestanden meer openen, en geeft hij een access-violation.

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
        seteuid(81);
        fd = open(uri,O_RDONLY);
        int error = errno;
        if(fd != -1)
        {
            strcpy(output,"HTTP/1.0 200 OK\r\n\r\n");
            a = strlen(output);
            i = 0;
            lseek(fd,0,SEEK_SET);
            i = lseek(fd,0,SEEK_END);
            lseek(fd,0,SEEK_SET);
            output = (char *)realloc(output,i+a+5);
            buffer = (char *)realloc(buffer,i+1);
            bzero(buffer,i+1);
            read(fd,buffer,i);
            a = appendData(output,strlen(output), buffer, i);
            *size = appendData(output,a,"\r\n\r\n",4);
        }

        else {
            seteuid(getuid());
            switch(error)
            {
                case(ENOENT):
                    strcpy(output,"HTTP/1.0 404 Not Found\r\n\r\n");
                    a = strlen(output);
                    fd = open("msg_htdocs/404.htm",O_RDWR | O_CREAT,
                                    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
                    if(!(errno == EEXIST) && !(errno == EACCES))
                    {
                        //CREATE A DEFAULT 404-msg
                        write(fd,DEFAULT_404_MESSAGE,
                                strlen(DEFAULT_404_MESSAGE));
                        lseek(fd,0,SEEK_SET);
                        i = lseek(fd,0,SEEK_END);
                        lseek(fd,0,SEEK_SET);
                        output = (char *)realloc(output,i+a+5);
                        buffer = (char *)realloc(buffer,i+1);
                        bzero(buffer,i+1);
                        read(fd,buffer,i);
                        a = appendData(output,strlen(output), buffer, i);
                        *size = appendData(output,a,"\r\n\r\n",4);
                    } else {
                        if((errno == EACCES))
                        {
                            output = (char *)realloc(output,i+a+5);
                            a = appendData(output,strlen(output), DEFAULT_404_MESSAGE,
                                                    strlen(DEFAULT_404_MESSAGE));
                            *size = appendData(output,a,"\r\n\r\n",4);
                        }
                    }
                    break;

                case(EACCES):
                  case(EPERM):
                    // 401 Forbidden
                    strcpy(output,"HTTP/1.0 401 Forbidden\r\n\r\n");
                    a = strlen(output);
                    fd = open("msg_htdocs/401.htm",O_RDWR | O_CREAT, 
                                    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
                    if(!(errno == EEXIST) && !(errno == EACCES))
                    {
                        //CREATE A DEFAULT 401-msg
                        write(fd,DEFAULT_401_MESSAGE,
                                   strlen(DEFAULT_404_MESSAGE));
                        lseek(fd,0,SEEK_SET);
                        i = lseek(fd,0,SEEK_END);
                        lseek(fd,0,SEEK_SET);
                        output = (char *)realloc(output,i+a+5);
                        buffer = (char *)realloc(buffer,i+1);
                        bzero(buffer,i+1);
                        read(fd,buffer,i);
                        a = appendData(output,strlen(output), buffer, i);
                        *size = appendData(output,a,"\r\n\r\n",4);
                    } else {
                        if((errno == EACCES))
                        {
                            output = (char *)realloc(output,i+a+5);
                            a = appendData(output,strlen(output), DEFAULT_401_MESSAGE, 
                                                    strlen(DEFAULT_401_MESSAGE));
                            *size = appendData(output,a,"\r\n\r\n",4);
                        }
                    }
                    break;
            }
        }

er zitten nog fouten in de structuur, en het programma is verre van af. (moet uiteindelijk ook http1.1 ondersteunen) maar op dit moment krijg ik allees 401 messages.

Wanneer de seteuid()'s weggehaald worden werkt alles wel, maar dan leest hij ALLE files. en niet alleen diegene met 'read'-permissies voor 'other'.


Ik heb ietwat met newlines gestrooid om de layout niet te verneuken ;)

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Is het volledige pad readable?

Zodra een directory 0750 is, dan kan je als other geen enkele file lezen in een onderliggende directory (ook al is deze 0666)

Yo dawg, I heard you like posts so I posted below your post so you can post again.


Verwijderd

Topicstarter
|:( |:( |:(

permissie voor ~ 0700 8)7

bedankt.