From edd17485248e75793ba04432fb7609f784c2f3fc Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 29 Jan 2009 17:18:43 +0000 Subject: 2009-01-29 Nickolay Semyonov-Kolchin PR 1359/cpukit * libcsupport/src/libio.c: rtems_libio_allocate: rtems_libio_iop_freelist incorrectly zeroed on semaphore error. Now checks error and does not modify anything until sure it has created semaphore. --- cpukit/ChangeLog | 8 ++++++++ cpukit/libcsupport/src/libio.c | 14 ++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'cpukit') diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index c449bf5fb2..baf945943a 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,11 @@ +2009-01-29 Nickolay Semyonov-Kolchin + + PR 1359/cpukit + * libcsupport/src/libio.c: rtems_libio_allocate: + rtems_libio_iop_freelist incorrectly zeroed on semaphore error. Now + checks error and does not modify anything until sure it has created + semaphore. + 2009-01-29 Gene Smith PR 1363/filesystem diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c index 16bd7f1ec8..a0c184b3d5 100644 --- a/cpukit/libcsupport/src/libio.c +++ b/cpukit/libcsupport/src/libio.c @@ -149,23 +149,25 @@ rtems_libio_t *rtems_libio_allocate( void ) { rtems_libio_t *iop, *next; rtems_status_code rc; + rtems_id sema; rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); if (rtems_libio_iop_freelist) { - iop = rtems_libio_iop_freelist; - next = iop->data1; - (void) memset( iop, 0, sizeof(rtems_libio_t) ); - iop->flags = LIBIO_FLAGS_OPEN; rc = rtems_semaphore_create( - RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops), + RTEMS_LIBIO_IOP_SEM(rtems_libio_iop_freelist - rtems_libio_iops), 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, - &iop->sem + &sema ); if (rc != RTEMS_SUCCESSFUL) goto failed; + iop = rtems_libio_iop_freelist; + next = iop->data1; + (void) memset( iop, 0, sizeof(rtems_libio_t) ); + iop->flags = LIBIO_FLAGS_OPEN; + iop->sem = sema; rtems_libio_iop_freelist = next; goto done; } -- cgit v1.2.3