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