24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

286 volume VI os16<br />

Script e sorgenti del kernel 287<br />

1890008 | uid_t uid = proc_table[pid_killer].uid;<br />

1890009 | pid_t pgrp = proc_table[pid_killer].pgrp;<br />

1890010 | int p; // Index inside the process table.<br />

1890011 | //<br />

1890012 | if (pid_target < -1)<br />

1890013 | {<br />

1890014 | errset (ESRCH);<br />

1890015 | return (-1);<br />

1890016 | }<br />

1890017 | else if (pid_target == -1)<br />

1890018 | {<br />

1890019 | if (sig == 0)<br />

1890020 | {<br />

1890021 | return (0);<br />

1890022 | }<br />

1890023 | if (euid == 0)<br />

1890024 | {<br />

1890025 | //<br />

1890026 | // Because ‘pid_target’ is qual to ‘-1’ and the effective<br />

1890027 | // user identity is ‘0’, then, all processes,<br />

1890028 | // except the kernel and init, will receive the signal.<br />

1890029 | //<br />

1890030 | // The following scan starts from 2, to preserve the<br />

1890031 | // kernel and init processes.<br />

1890032 | //<br />

1890033 | for (p = 2; p < PROCESS_MAX; p++)<br />

1890034 | {<br />

1890035 | if ( proc_table[p].status != PROC_EMPTY<br />

1890036 | && proc_table[p].status != PROC_ZOMBIE)<br />

1890037 | {<br />

1890038 | proc_sig_on (p, sig);<br />

1890039 | }<br />

1890040 | }<br />

1890041 | }<br />

1890042 | else<br />

1890043 | {<br />

1890044 | //<br />

1890045 | // Because ‘pid_target’ is qual to ‘-1’, but the effective<br />

1890046 | // user identity is not ‘0’, then, all processes owned<br />

1890047 | // by the same effective user identity, will receive the<br />

1890048 | // signal.<br />

1890049 | //<br />

1890050 | // The following scan starts from 1, to preserve the<br />

1890051 | // kernel process.<br />

1890052 | //<br />

1890053 | for (p = 1; p < PROCESS_MAX; p++)<br />

1890054 | {<br />

1890055 | if ( proc_table[p].status != PROC_EMPTY<br />

1890056 | && proc_table[p].status != PROC_ZOMBIE<br />

1890057 | && proc_table[p].uid == euid)<br />

1890058 | {<br />

1890059 | proc_sig_on (p, sig);<br />

1890060 | }<br />

1890061 | }<br />

1890062 | }<br />

1890063 | return (0);<br />

1890064 | }<br />

1890065 | else if (pid_target == 0)<br />

1890066 | {<br />

1890067 | if (sig == 0)<br />

1890068 | {<br />

1890069 | return (0);<br />

1890070 | }<br />

1890071 | //<br />

1890072 | // The following scan starts from 1, to preserve the<br />

1890073 | // kernel process.<br />

1890074 | //<br />

1890075 | for (p = 1; p < PROCESS_MAX; p++)<br />

1890076 | {<br />

1890077 | if ( proc_table[p].status != PROC_EMPTY<br />

1890078 | && proc_table[p].status != PROC_ZOMBIE<br />

1890079 | && proc_table[p].pgrp == pgrp)<br />

1890080 | {<br />

1890081 | proc_sig_on (p, sig);<br />

1890082 | }<br />

1890083 | }<br />

1890084 | return (0);<br />

1890085 | }<br />

1890086 | else if (pid_target >= PROCESS_MAX)<br />

1890087 | {<br />

1890088 | errset (ESRCH);<br />

1890089 | return (-1);<br />

1890090 | }<br />

1890091 | else // (pid_target > 0)<br />

1890092 | {<br />

1890093 | if (proc_table[pid_target].status == PROC_EMPTY ||<br />

1890094 | proc_table[pid_target].status == PROC_ZOMBIE)<br />

1890095 | {<br />

1890096 | errset (ESRCH);<br />

1890097 | return (-1);<br />

1890098 | }<br />

1890099 | else if (uid == proc_table[pid_target].uid ||<br />

1890100 | uid == proc_table[pid_target].suid ||<br />

1890101 | euid == proc_table[pid_target].uid ||<br />

1890102 | euid == proc_table[pid_target].suid ||<br />

1890103 | euid == 0)<br />

1890104 | {<br />

1890105 | if (sig == 0)<br />

1890106 | {<br />

1890107 | return (0);<br />

1890108 | }<br />

1890109 | else<br />

1890110 | {<br />

1890111 | proc_sig_on (pid_target, sig);<br />

1890112 | return (0);<br />

1890113 | }<br />

1890114 | }<br />

1890115 | else<br />

1890116 | {<br />

1890117 | errset (EPERM);<br />

1890118 | return (-1);<br />

1890119 | }<br />

1890120 | }<br />

1890121 |}<br />

104.9.25 kernel/proc/proc_sys_seteuid.c<br />

Si veda la sezione 103.8.24.<br />

1900001 |#include <br />

1900002 |#include <br />

1900003 |//----------------------------------------------------------------------<br />

1900004 |int<br />

1900005 |proc_sys_seteuid (pid_t pid, uid_t euid)<br />

1900006 |{<br />

1900007 | if (proc_table[pid].euid == 0)<br />

1900008 | {<br />

1900009 | proc_table[pid].euid = euid;<br />

1900010 | return (0);<br />

1900011 | }<br />

1900012 | else if (euid == proc_table[pid].euid)<br />

1900013 | {<br />

1900014 | return (0);<br />

1900015 | }<br />

1900016 | else if (euid == proc_table[pid].uid || euid == proc_table[pid].suid)<br />

1900017 | {<br />

1900018 | proc_table[pid].euid = euid;<br />

1900019 | return (0);<br />

1900020 | }<br />

1900021 | else<br />

1900022 | {<br />

1900023 | errset (EPERM);<br />

1900024 | return (-1);<br />

1900025 | }<br />

1900026 |}<br />

104.9.26 kernel/proc/proc_sys_setuid.c<br />

Si veda la sezione 103.8.25.<br />

1910001 |#include <br />

1910002 |#include <br />

1910003 |//----------------------------------------------------------------------<br />

1910004 |int<br />

1910005 |proc_sys_setuid (pid_t pid, uid_t uid)<br />

1910006 |{<br />

1910007 | if (proc_table[pid].euid == 0)<br />

1910008 | {<br />

1910009 | proc_table[pid].uid = uid;<br />

1910010 | proc_table[pid].euid = uid;<br />

1910011 | proc_table[pid].suid = uid;<br />

1910012 | return (0);<br />

1910013 | }<br />

1910014 | else if (uid == proc_table[pid].euid)<br />

1910015 | {<br />

1910016 | return (0);<br />

1910017 | }<br />

1910018 | else if (uid == proc_table[pid].uid || uid == proc_table[pid].suid)<br />

1910019 | {<br />

1910020 | proc_table[pid].euid = uid;<br />

1910021 | return (0);<br />

1910022 | }<br />

1910023 | else<br />

1910024 | {<br />

1910025 | errset (EPERM);<br />

1910026 | return (-1);<br />

1910027 | }<br />

1910028 |}<br />

104.9.27 kernel/proc/proc_sys_signal.c<br />

Si veda la sezione 103.8.26.<br />

1920001 |#include <br />

1920002 |#include <br />

1920003 |//----------------------------------------------------------------------<br />

1920004 |sighandler_t<br />

1920005 |proc_sys_signal (pid_t pid, int sig, sighandler_t handler)<br />

1920006 |{<br />

1920007 | unsigned long int flag = 1L

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!