⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exec.c

📁 linux0.11 version(301k)
💻 C
📖 第 1 页 / 共 3 页
字号:
<a name=L102 href="source/fs/exec.c#L102">102</a> <b><i> * set_fs() unless we absolutely have to.</i></b><a name=L103 href="source/fs/exec.c#L103">103</a> <b><i> */</i></b><a name=L104 href="source/fs/exec.c#L104">104</a> static unsigned long <a href="ident?i=copy_strings">copy_strings</a>(int argc,char ** <a href="ident?i=argv">argv</a>,unsigned long *page,<a name=L105 href="source/fs/exec.c#L105">105</a>                 unsigned long p, int from_kmem)<a name=L106 href="source/fs/exec.c#L106">106</a> {<a name=L107 href="source/fs/exec.c#L107">107</a>         char *tmp, *pag;<a name=L108 href="source/fs/exec.c#L108">108</a>         int len, offset = 0;<a name=L109 href="source/fs/exec.c#L109">109</a>         unsigned long old_fs, new_fs;<a name=L110 href="source/fs/exec.c#L110">110</a> <a name=L111 href="source/fs/exec.c#L111">111</a>         if (!p)<a name=L112 href="source/fs/exec.c#L112">112</a>                 return 0;       <b><i>/* bullet-proofing */</i></b><a name=L113 href="source/fs/exec.c#L113">113</a>         new_fs = <a href="ident?i=get_ds">get_ds</a>();<a name=L114 href="source/fs/exec.c#L114">114</a>         old_fs = <a href="ident?i=get_fs">get_fs</a>();<a name=L115 href="source/fs/exec.c#L115">115</a>         if (from_kmem==2)<a name=L116 href="source/fs/exec.c#L116">116</a>                 <a href="ident?i=set_fs">set_fs</a>(new_fs);<a name=L117 href="source/fs/exec.c#L117">117</a>         while (argc-- &gt; 0) {<a name=L118 href="source/fs/exec.c#L118">118</a>                 if (from_kmem == 1)<a name=L119 href="source/fs/exec.c#L119">119</a>                         <a href="ident?i=set_fs">set_fs</a>(new_fs);<a name=L120 href="source/fs/exec.c#L120">120</a>                 if (!(tmp = (char *)<a href="ident?i=get_fs_long">get_fs_long</a>(((unsigned long *)<a href="ident?i=argv">argv</a>)+argc)))<a name=L121 href="source/fs/exec.c#L121">121</a>                         <a href="ident?i=panic">panic</a>(<i>"argc is wrong"</i>);<a name=L122 href="source/fs/exec.c#L122">122</a>                 if (from_kmem == 1)<a name=L123 href="source/fs/exec.c#L123">123</a>                         <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L124 href="source/fs/exec.c#L124">124</a>                 len=0;          <b><i>/* remember zero-padding */</i></b><a name=L125 href="source/fs/exec.c#L125">125</a>                 do {<a name=L126 href="source/fs/exec.c#L126">126</a>                         len++;<a name=L127 href="source/fs/exec.c#L127">127</a>                 } while (<a href="ident?i=get_fs_byte">get_fs_byte</a>(tmp++));<a name=L128 href="source/fs/exec.c#L128">128</a>                 if (p-len &lt; 0) {        <b><i>/* this shouldn't happen - 128kB */</i></b><a name=L129 href="source/fs/exec.c#L129">129</a>                         <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L130 href="source/fs/exec.c#L130">130</a>                         return 0;<a name=L131 href="source/fs/exec.c#L131">131</a>                 }<a name=L132 href="source/fs/exec.c#L132">132</a>                 while (len) {<a name=L133 href="source/fs/exec.c#L133">133</a>                         --p; --tmp; --len;<a name=L134 href="source/fs/exec.c#L134">134</a>                         if (--offset &lt; 0) {<a name=L135 href="source/fs/exec.c#L135">135</a>                                 offset = p % <a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>;<a name=L136 href="source/fs/exec.c#L136">136</a>                                 if (from_kmem==2)<a name=L137 href="source/fs/exec.c#L137">137</a>                                         <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L138 href="source/fs/exec.c#L138">138</a>                                 if (!(pag = (char *) page[p/<a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>]) &amp;&amp;<a name=L139 href="source/fs/exec.c#L139">139</a>                                     !(pag = (char *) page[p/<a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>] =<a name=L140 href="source/fs/exec.c#L140">140</a>                                       (unsigned long *) <a href="ident?i=get_free_page">get_free_page</a>())) <a name=L141 href="source/fs/exec.c#L141">141</a>                                         return 0;<a name=L142 href="source/fs/exec.c#L142">142</a>                                 if (from_kmem==2)<a name=L143 href="source/fs/exec.c#L143">143</a>                                         <a href="ident?i=set_fs">set_fs</a>(new_fs);<a name=L144 href="source/fs/exec.c#L144">144</a> <a name=L145 href="source/fs/exec.c#L145">145</a>                         }<a name=L146 href="source/fs/exec.c#L146">146</a>                         *(pag + offset) = <a href="ident?i=get_fs_byte">get_fs_byte</a>(tmp);<a name=L147 href="source/fs/exec.c#L147">147</a>                 }<a name=L148 href="source/fs/exec.c#L148">148</a>         }<a name=L149 href="source/fs/exec.c#L149">149</a>         if (from_kmem==2)<a name=L150 href="source/fs/exec.c#L150">150</a>                 <a href="ident?i=set_fs">set_fs</a>(old_fs);<a name=L151 href="source/fs/exec.c#L151">151</a>         return p;<a name=L152 href="source/fs/exec.c#L152">152</a> }<a name=L153 href="source/fs/exec.c#L153">153</a> <a name=L154 href="source/fs/exec.c#L154">154</a> static unsigned long <a href="ident?i=change_ldt">change_ldt</a>(unsigned long text_size,unsigned long * page)<a name=L155 href="source/fs/exec.c#L155">155</a> {<a name=L156 href="source/fs/exec.c#L156">156</a>         unsigned long code_limit,data_limit,code_base,data_base;<a name=L157 href="source/fs/exec.c#L157">157</a>         int i;<a name=L158 href="source/fs/exec.c#L158">158</a> <a name=L159 href="source/fs/exec.c#L159">159</a>         code_limit = text_size+<a href="ident?i=PAGE_SIZE">PAGE_SIZE</a> -1;<a name=L160 href="source/fs/exec.c#L160">160</a>         code_limit &amp;= 0xFFFFF000;<a name=L161 href="source/fs/exec.c#L161">161</a>         data_limit = 0x4000000;<a name=L162 href="source/fs/exec.c#L162">162</a>         code_base = <a href="ident?i=get_base">get_base</a>(<a href="ident?i=current">current</a>-&gt;ldt[1]);<a name=L163 href="source/fs/exec.c#L163">163</a>         data_base = code_base;<a name=L164 href="source/fs/exec.c#L164">164</a>         <a href="ident?i=set_base">set_base</a>(<a href="ident?i=current">current</a>-&gt;ldt[1],code_base);<a name=L165 href="source/fs/exec.c#L165">165</a>         <a href="ident?i=set_limit">set_limit</a>(<a href="ident?i=current">current</a>-&gt;ldt[1],code_limit);<a name=L166 href="source/fs/exec.c#L166">166</a>         <a href="ident?i=set_base">set_base</a>(<a href="ident?i=current">current</a>-&gt;ldt[2],data_base);<a name=L167 href="source/fs/exec.c#L167">167</a>         <a href="ident?i=set_limit">set_limit</a>(<a href="ident?i=current">current</a>-&gt;ldt[2],data_limit);<a name=L168 href="source/fs/exec.c#L168">168</a> <b><i>/* make sure fs points to the NEW data segment */</i></b><a name=L169 href="source/fs/exec.c#L169">169</a>         __asm__(<i>"pushl $0x17\n\tpop %%fs"</i>::);<a name=L170 href="source/fs/exec.c#L170">170</a>         data_base += data_limit;<a name=L171 href="source/fs/exec.c#L171">171</a>         for (i=<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a>-1 ; i&gt;=0 ; i--) {<a name=L172 href="source/fs/exec.c#L172">172</a>                 data_base -= <a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>;<a name=L173 href="source/fs/exec.c#L173">173</a>                 if (page[i])<a name=L174 href="source/fs/exec.c#L174">174</a>                         <a href="ident?i=put_page">put_page</a>(page[i],data_base);<a name=L175 href="source/fs/exec.c#L175">175</a>         }<a name=L176 href="source/fs/exec.c#L176">176</a>         return data_limit;<a name=L177 href="source/fs/exec.c#L177">177</a> }<a name=L178 href="source/fs/exec.c#L178">178</a> <a name=L179 href="source/fs/exec.c#L179">179</a> <b><i>/*</i></b><a name=L180 href="source/fs/exec.c#L180">180</a> <b><i> * 'do_execve()' executes a new program.</i></b><a name=L181 href="source/fs/exec.c#L181">181</a> <b><i> */</i></b><a name=L182 href="source/fs/exec.c#L182">182</a> int <a href="ident?i=do_execve">do_execve</a>(unsigned long * eip,long tmp,char * filename,<a name=L183 href="source/fs/exec.c#L183">183</a>         char ** <a href="ident?i=argv">argv</a>, char ** <a href="ident?i=envp">envp</a>)<a name=L184 href="source/fs/exec.c#L184">184</a> {<a name=L185 href="source/fs/exec.c#L185">185</a>         struct <a href="ident?i=m_inode">m_inode</a> * inode;<a name=L186 href="source/fs/exec.c#L186">186</a>         struct <a href="ident?i=buffer_head">buffer_head</a> * bh;<a name=L187 href="source/fs/exec.c#L187">187</a>         struct <a href="ident?i=exec">exec</a> ex;<a name=L188 href="source/fs/exec.c#L188">188</a>         unsigned long page[<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a>];<a name=L189 href="source/fs/exec.c#L189">189</a>         int i,argc,envc;<a name=L190 href="source/fs/exec.c#L190">190</a>         int e_uid, e_gid;<a name=L191 href="source/fs/exec.c#L191">191</a>         int retval;<a name=L192 href="source/fs/exec.c#L192">192</a>         int sh_bang = 0;<a name=L193 href="source/fs/exec.c#L193">193</a>         unsigned long p=<a href="ident?i=PAGE_SIZE">PAGE_SIZE</a>*<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a>-4;<a name=L194 href="source/fs/exec.c#L194">194</a> <a name=L195 href="source/fs/exec.c#L195">195</a>         if ((0xffff &amp; eip[1]) != 0x000f)<a name=L196 href="source/fs/exec.c#L196">196</a>                 <a href="ident?i=panic">panic</a>(<i>"execve called from supervisor mode"</i>);<a name=L197 href="source/fs/exec.c#L197">197</a>         for (i=0 ; i&lt;<a href="ident?i=MAX_ARG_PAGES">MAX_ARG_PAGES</a> ; i++)       <b><i>/* clear page-table */</i></b><a name=L198 href="source/fs/exec.c#L198">198</a>                 page[i]=0;<a name=L199 href="source/fs/exec.c#L199">199</a>         if (!(inode=<a href="ident?i=namei">namei</a>(filename)))           <b><i>/* get executables inode */</i></b><a name=L200 href="source/fs/exec.c#L200">200</a>                 return -<a href="ident?i=ENOENT">ENOENT</a>;<a name=L201 href="source/fs/exec.c#L201">201</a>         argc = <a href="ident?i=count">count</a>(<a href="ident?i=argv">argv</a>);<a name=L202 href="source/fs/exec.c#L202">202</a>         envc = <a href="ident?i=count">count</a>(<a href="ident?i=envp">envp</a>);<a name=L203 href="source/fs/exec.c#L203">203</a>         <a name=L204 href="source/fs/exec.c#L204">204</a> restart_interp:<a name=L205 href="source/fs/exec.c#L205">205</a>         if (!<a href="ident?i=S_ISREG">S_ISREG</a>(inode-&gt;i_mode)) {  <b><i>/* must be regular file */</i></b><a name=L206 href="source/fs/exec.c#L206">206</a>                 retval = -<a href="ident?i=EACCES">EACCES</a>;<a name=L207 href="source/fs/exec.c#L207">207</a>                 goto exec_error2;<a name=L208 href="source/fs/exec.c#L208">208</a>         }<a name=L209 href="source/fs/exec.c#L209">209</a>         i = inode-&gt;i_mode;<a name=L210 href="source/fs/exec.c#L210">210</a>         e_uid = (i &amp; <a href="ident?i=S_ISUID">S_ISUID</a>) ? inode-&gt;i_uid : <a href="ident?i=current">current</a>-&gt;euid;<a name=L211 href="source/fs/exec.c#L211">211</a>         e_gid = (i &amp; <a href="ident?i=S_ISGID">S_ISGID</a>) ? inode-&gt;i_gid : <a href="ident?i=current">current</a>-&gt;egid;<a name=L212 href="source/fs/exec.c#L212">212</a>         if (<a href="ident?i=current">current</a>-&gt;euid == inode-&gt;i_uid)<a name=L213 href="source/fs/exec.c#L213">213</a>                 i &gt;&gt;= 6;<a name=L214 href="source/fs/exec.c#L214">214</a>         else if (<a href="ident?i=current">current</a>-&gt;egid == inode-&gt;i_gid)<a name=L215 href="source/fs/exec.c#L215">215</a>                 i &gt;&gt;= 3;<a name=L216 href="source/fs/exec.c#L216">216</a>         if (!(i &amp; 1) &amp;&amp;<a name=L217 href="source/fs/exec.c#L217">217</a>             !((inode-&gt;i_mode &amp; 0111) &amp;&amp; <a href="ident?i=suser">suser</a>())) {<a name=L218 href="source/fs/exec.c#L218">218</a>                 retval = -<a href="ident?i=ENOEXEC">ENOEXEC</a>;<a name=L219 href="source/fs/exec.c#L219">219</a>                 goto exec_error2;<a name=L220 href="source/fs/exec.c#L220">220</a>         }<a name=L221 href="source/fs/exec.c#L221">221</a>         if (!(bh = <a href="ident?i=bread">bread</a>(inode-&gt;i_dev,inode-&gt;i_zone[0]))) {<a name=L222 href="source/fs/exec.c#L222">222</a>                 retval = -<a href="ident?i=EACCES">EACCES</a>;<a name=L223 href="source/fs/exec.c#L223">223</a>                 goto exec_error2;<a name=L224 href="source/fs/exec.c#L224">224</a>         }<a name=L225 href="source/fs/exec.c#L225">225</a>         ex = *((struct <a href="ident?i=exec">exec</a> *) bh-&gt;b_data);     <b><i>/* read exec-header */</i></b><a name=L226 href="source/fs/exec.c#L226">226</a>         if ((bh-&gt;b_data[0] == <i>'#'</i>) &amp;&amp; (bh-&gt;b_data[1] == <i>'!'</i>) &amp;&amp; (!sh_bang)) {<a name=L227 href="source/fs/exec.c#L227">227</a>                 <b><i>/*</i></b><a name=L228 href="source/fs/exec.c#L228">228</a> <b><i>                 * This section does the #! interpretation.</i></b><a name=L229 href="source/fs/exec.c#L229">229</a> <b><i>                 * Sorta complicated, but hopefully it will work.  -TYT</i></b><a name=L230 href="source/fs/exec.c#L230">230</a> <b><i>                 */</i></b><a name=L231 href="source/fs/exec.c#L231">231</a> <a name=L232 href="source/fs/exec.c#L232">232</a>                 char <a href="ident?i=buf">buf</a>[1023], *cp, *interp, *i_name, *i_arg;<a name=L233 href="source/fs/exec.c#L233">233</a>                 unsigned long old_fs;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -