diff options
Diffstat (limited to 'hurd/alloc-fd.c')
-rw-r--r-- | hurd/alloc-fd.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/hurd/alloc-fd.c b/hurd/alloc-fd.c index f21d5bb8e1..dc6e64f3b7 100644 --- a/hurd/alloc-fd.c +++ b/hurd/alloc-fd.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994, 1995 Free Software Foundation, Inc. +/* Copyright (C) 1994, 1995, 1996 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 @@ -97,6 +97,13 @@ _hurd_alloc_fd (int *fd, int first_fd) else if (size <= first_fd) size = first_fd + 1; + if (size * sizeof (*_hurd_dtable) < size) + { + /* Integer overflow! */ + errno = ENOMEM; + goto out; + } + /* If we fail to allocate that, decrement the desired size until we succeed in allocating it. */ do @@ -117,6 +124,8 @@ _hurd_alloc_fd (int *fd, int first_fd) /* Go back to the loop to initialize the first new slot. */ goto search; } + else + errno = ENOMEM; } else errno = EMFILE; @@ -124,6 +133,7 @@ _hurd_alloc_fd (int *fd, int first_fd) else errno = EINVAL; /* Bogus FIRST_FD value. */ + out: __mutex_unlock (&_hurd_dtable_lock); _hurd_critical_section_unlock (crit); |