Subversion Repositories HelenOS-historic

Rev

Rev 963 | Rev 1026 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 963 Rev 973
Line 183... Line 183...
183
     * Check if the virtual address starts on page boundary.
183
     * Check if the virtual address starts on page boundary.
184
     */
184
     */
185
    if (ALIGN_UP(entry->p_vaddr, PAGE_SIZE) != entry->p_vaddr)
185
    if (ALIGN_UP(entry->p_vaddr, PAGE_SIZE) != entry->p_vaddr)
186
        return EE_UNSUPPORTED;
186
        return EE_UNSUPPORTED;
187
 
187
 
188
    /*
-
 
189
     * Copying the segment out is certainly necessary for segments with p_filesz < p_memsz
-
 
190
     * because of the effect of .bss-like sections. For security reasons, it looks like a
-
 
191
     * good idea to copy the segment anyway.
-
 
192
     */
-
 
193
    segment_size = ALIGN_UP(max(entry->p_filesz, entry->p_memsz), PAGE_SIZE);
188
    segment_size = ALIGN_UP(max(entry->p_filesz, entry->p_memsz), PAGE_SIZE);
194
    segment = malloc(segment_size, 0);
189
    if ((entry->p_flags & PF_W)) {
-
 
190
        /* If writable, copy data (should be COW in the future) */
195
    if (entry->p_filesz < entry->p_memsz)
191
        segment = malloc(segment_size, 0);
196
        memsetb((__address) (segment + entry->p_filesz), segment_size - entry->p_filesz, 0);
192
        memsetb((__address) (segment + entry->p_filesz), segment_size - entry->p_filesz, 0);
197
    memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
193
        memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
-
 
194
    } else /* Map identically original data */
-
 
195
        segment = ((void *) elf) + entry->p_offset;
198
 
196
 
199
    a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
197
    a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
200
    if (!a)
198
    if (!a)
201
        return EE_IRRECOVERABLE;
199
        return EE_IRRECOVERABLE;
202
   
200