diff options
Diffstat (limited to 'sysdeps/mach')
-rw-r--r-- | sysdeps/mach/hurd/Versions | 3 | ||||
-rw-r--r-- | sysdeps/mach/hurd/getcwd.c | 7 | ||||
-rw-r--r-- | sysdeps/mach/hurd/i386/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/mach/hurd/mmap.c | 24 | ||||
-rw-r--r-- | sysdeps/mach/hurd/spawni.c | 5 |
5 files changed, 18 insertions, 24 deletions
diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions index dcaaae6146..89e19061af 100644 --- a/sysdeps/mach/hurd/Versions +++ b/sysdeps/mach/hurd/Versions @@ -4,6 +4,9 @@ libc { __getcwd; __mmap; } GLIBC_PRIVATE { + # Functions shared with the dynamic linker + __libc_read; __libc_write; __libc_lseek64; + _dl_init_first; } } diff --git a/sysdeps/mach/hurd/getcwd.c b/sysdeps/mach/hurd/getcwd.c index 510290460c..7e07e6b404 100644 --- a/sysdeps/mach/hurd/getcwd.c +++ b/sysdeps/mach/hurd/getcwd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98,2002 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,93,94,95,96,97,98,2002,04 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -50,6 +50,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, file_t parent; char *dirbuf = NULL; unsigned int dirbufsize = 0; + const size_t orig_size = size; inline void cleanup (void) { @@ -67,7 +68,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, } - if (size == 0) + if (size <= 0) { if (buf != NULL) { @@ -226,7 +227,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, if (file_namep - file_name < d->d_namlen + 1) { - if (buf != NULL) + if (orig_size > 0) { errno = ERANGE; return NULL; diff --git a/sysdeps/mach/hurd/i386/Makefile b/sysdeps/mach/hurd/i386/Makefile index 56fcba8fb9..e7d3b44682 100644 --- a/sysdeps/mach/hurd/i386/Makefile +++ b/sysdeps/mach/hurd/i386/Makefile @@ -3,3 +3,6 @@ sysdep_routines += ioperm sysdep_headers += sys/io.h endif +ifeq ($(subdir),csu) +CFLAGS-init-first.c += -momit-leaf-frame-pointer +endif diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c index 85bde529b9..1d1460cead 100644 --- a/sysdeps/mach/hurd/mmap.c +++ b/sysdeps/mach/hurd/mmap.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994,1995,1996,1997,1999,2002,2003 +/* Copyright (C) 1994,1995,1996,1997,1999,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -39,10 +39,13 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) vm_prot_t vmprot; memory_object_t memobj; vm_address_t mapaddr; - vm_size_t pageoff; mapaddr = (vm_address_t) addr; + /* ADDR and OFFSET must be page-aligned. */ + if ((mapaddr & (vm_page_size - 1)) || (offset & (vm_page_size - 1))) + return (__ptr_t) (long int) __hurd_fail (EINVAL); + if ((flags & (MAP_TYPE|MAP_INHERIT)) == MAP_ANON && prot == (PROT_READ|PROT_WRITE)) /* cf VM_PROT_DEFAULT */ { @@ -62,20 +65,6 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) return err ? (__ptr_t) (long int) __hurd_fail (err) : (__ptr_t) mapaddr; } - pageoff = offset & (vm_page_size - 1); - offset &= ~(vm_page_size - 1); - - if (flags & MAP_FIXED) - { - /* A specific address is requested. It need not be page-aligned; - it just needs to be congruent with the object offset. */ - if ((mapaddr & (vm_page_size - 1)) != pageoff) - return (__ptr_t) (long int) __hurd_fail (EINVAL); - else - /* We will add back PAGEOFF after mapping. */ - mapaddr -= pageoff; - } - vmprot = VM_PROT_NONE; if (prot & PROT_READ) vmprot |= VM_PROT_READ; @@ -173,9 +162,6 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset) if (err) return (__ptr_t) (long int) __hurd_fail (err); - /* Adjust the mapping address for the offset-within-page. */ - mapaddr += pageoff; - return (__ptr_t) mapaddr; } diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c index 73b4d3507c..244ca2d6e1 100644 --- a/sysdeps/mach/hurd/spawni.c +++ b/sysdeps/mach/hurd/spawni.c @@ -1,5 +1,5 @@ /* spawn a new process running an executable. Hurd version. - Copyright (C) 2001,02 Free Software Foundation, Inc. + Copyright (C) 2001,02,04 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -399,6 +399,7 @@ __spawni (pid_t *pid, const char *file, NEW_TABLE (dtable, newfd); \ NEW_TABLE (ulink_dtable, newfd); \ NEW_TABLE (dtable_cells, newfd); \ + dtablesize = newfd + 1; \ } \ ((unsigned int)newfd < dtablesize ? 0 : EMFILE); \ }) @@ -592,7 +593,7 @@ __spawni (pid_t *pid, const char *file, case ESTALE: case ENOTDIR: /* Those errors indicate the file is missing or not executable -v by us, in which case we want to just try the next path + by us, in which case we want to just try the next path directory. */ continue; |