View | Details | Raw Unified | Return to bug 152115
Collapse All | Expand All

(-)loader/preloader.c (+25 lines)
Lines 208-213 Link Here
208
    return SYSCALL_RET(ret);
208
    return SYSCALL_RET(ret);
209
}
209
}
210
210
211
static inline int wld_personality( int perso )
212
{
213
    int ret;
214
    __asm__ __volatile__( "pushl %%ebx; movl %2,%%ebx; int $0x80; popl %%ebx"
215
                          : "=a" (ret) : "0" (SYS_personality), "r" (perso) );
216
    return SYSCALL_RET(ret);
217
}
218
211
static inline ssize_t wld_read( int fd, void *buffer, size_t len )
219
static inline ssize_t wld_read( int fd, void *buffer, size_t len )
212
{
220
{
213
    int ret;
221
    int ret;
Lines 226-231 Link Here
226
    return SYSCALL_RET(ret);
234
    return SYSCALL_RET(ret);
227
}
235
}
228
236
237
static inline int wld_execve( const char * path, char **argv, char ** envp )
238
{
239
    int ret;
240
    __asm__ __volatile__( "pushl %%ebx; movl %2,%%ebx; int $0x80; popl %%ebx"
241
                          : "=a" (ret) : "0" (SYS_execve), "r" (path), "c" (argv), "d" (envp) );
242
    return SYSCALL_RET(ret);
243
}
244
229
static inline int wld_mprotect( const void *addr, size_t len, int prot )
245
static inline int wld_mprotect( const void *addr, size_t len, int prot )
230
{
246
{
231
    int ret;
247
    int ret;
Lines 886-891 Link Here
886
    ElfW(auxv_t) new_av[12], delete_av[3], *av;
902
    ElfW(auxv_t) new_av[12], delete_av[3], *av;
887
    struct wld_link_map main_binary_map, ld_so_map;
903
    struct wld_link_map main_binary_map, ld_so_map;
888
    struct wine_preload_info **wine_main_preload_info;
904
    struct wine_preload_info **wine_main_preload_info;
905
    unsigned int perso;
889
906
890
    pargc = *stack;
907
    pargc = *stack;
891
    argv = (char **)pargc + 1;
908
    argv = (char **)pargc + 1;
Lines 894-899 Link Here
894
    /* skip over the parameters */
911
    /* skip over the parameters */
895
    p = argv + *pargc + 1;
912
    p = argv + *pargc + 1;
896
913
914
    perso = wld_personality(0xffffffff);
915
    if (!(perso & 0x200000)) {
916
        wld_personality(perso | 0x200000);
917
    	wld_execve(argv[0],argv,p);
918
	fatal_error( "Failed execve %s\n", argv[0] );
919
	return NULL;
920
    }
921
897
    /* skip over the environment */
922
    /* skip over the environment */
898
    while (*p)
923
    while (*p)
899
    {
924
    {

Return to bug 152115