aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2010-01-11 23:24:47 +0000
committerJeff Johnston <jjohnstn@redhat.com>2010-01-11 23:24:47 +0000
commiteeda30d7d5688c707d0c09d68ab342b285361408 (patch)
treebc2df4ba11a01d7b8280ecac392d1f06ae8cab7f
parentd8a439359a582d29a6ee7b9c0d2309f46544e777 (diff)
downloadnewlib-eeda30d7d5688c707d0c09d68ab342b285361408.zip
newlib-eeda30d7d5688c707d0c09d68ab342b285361408.tar.gz
newlib-eeda30d7d5688c707d0c09d68ab342b285361408.tar.bz2
2010-01-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libc/posix/telldir.c (_cleanupdir): Fixed usage of freed memory.
-rw-r--r--newlib/ChangeLog4
-rw-r--r--newlib/libc/posix/telldir.c22
2 files changed, 15 insertions, 11 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 5136fa4..1afbaf6 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,7 @@
+2010-01-11 Sebastian Huber <sebastian.huber@embedded-brains.de>
+
+ * libc/posix/telldir.c (_cleanupdir): Fixed usage of freed memory.
+
2010-01-11 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* libc/include/math.h (log2, log2f): Disable macro versions for C++,
diff --git a/newlib/libc/posix/telldir.c b/newlib/libc/posix/telldir.c
index ad654b1..5178467 100644
--- a/newlib/libc/posix/telldir.c
+++ b/newlib/libc/posix/telldir.c
@@ -169,26 +169,26 @@ _DEFUN(_cleanupdir, (dirp),
__lock_acquire(dd_hash_lock);
#endif
for (i = 0; i < NDIRHASH; ++i) {
+ struct ddloc head;
register struct ddloc *lp;
register struct ddloc *prevlp;
+
lp = dd_hash[i];
- while (lp != NULL && lp->loc_dirp == dirp) {
- dd_hash[i] = lp->loc_next;
- prevlp = lp;
- free((caddr_t)lp);
- lp = prevlp->loc_next;
- }
- prevlp = lp;
+ head.loc_next = lp;
+ prevlp = &head;
while (lp != NULL) {
- lp = lp->loc_next;
- if (lp != NULL && lp->loc_dirp == dirp) {
- prevlp->loc_next = lp->loc_next;
+ struct ddloc *nextlp;
+
+ nextlp = lp->loc_next;
+ if (lp->loc_dirp == dirp) {
+ prevlp->loc_next = nextlp;
free((caddr_t)lp);
- lp = prevlp;
}
else
prevlp = lp;
+ lp = nextlp;
}
+ dd_hash[i] = head.loc_next;
}
#ifdef HAVE_DD_LOCK
__lock_release(dd_hash_lock);