summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-01-29 17:19:00 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-01-29 17:19:00 +0000
commitb7a08ad494477cd3d6d01f0815de99e4182202c1 (patch)
treed851eb20381f7561e17eda34cb6b8de09b7a60ae
parentc9b28ef278c244be490981ad717114eb926defea (diff)
2009-01-29 Nickolay Semyonov-Kolchin <nbkolchin@gmail.com>
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.
-rw-r--r--cpukit/ChangeLog8
-rw-r--r--cpukit/libcsupport/src/libio.c14
2 files changed, 16 insertions, 6 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 3f70d40ae5..7f06a72f6f 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,3 +1,11 @@
+2009-01-29 Nickolay Semyonov-Kolchin <nbkolchin@gmail.com>
+
+ 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 <gene.smith@siemens.com>
PR 1363/filesystem
diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c
index 879cd8134c..b225b57f6f 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;
}