|
Ian Kent |
5ec16e |
autofs-5.0.6 - fix segmentation fault in do_remount_indirect()
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
From: Leonardo Chiquitto <leonardo.lists@gmail.com>
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
In some rare circumstance, it's possible that automount will crash
|
|
Ian Kent |
5ec16e |
on startup while trying to reconnect to a "half-broken" NFS mount
|
|
Ian Kent |
5ec16e |
point.
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
The segmentation fault happens because we're not testing scandir()'s
|
|
Ian Kent |
5ec16e |
return value in do_remount_indirect():
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
lib/mounts.c:
|
|
Ian Kent |
5ec16e |
1210 i = j = scandir(buf, &de2, 0, alphasort);
|
|
Ian Kent |
5ec16e |
1211 while (i--)
|
|
Ian Kent |
5ec16e |
1212 free(de2[i]);
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
So, if scandir() returns -1, it will try to free de2[-1], de2[-2], etc.
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
Here's the call trace, for reference:
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
Program terminated with signal 11, Segmentation fault.
|
|
Ian Kent |
5ec16e |
#0 0x00007ffff7fe2425 in do_remount_indirect (ap=0x7ffff821e070, fd=15,
|
|
Ian Kent |
5ec16e |
path=0x7ffff821e150 "/nfs/iil") at mounts.c:1212
|
|
Ian Kent |
5ec16e |
1212 free(de2[i]);
|
|
Ian Kent |
5ec16e |
(gdb) print j
|
|
Ian Kent |
5ec16e |
$1 = -1
|
|
Ian Kent |
5ec16e |
(gdb) print de2
|
|
Ian Kent |
5ec16e |
$3 = (struct dirent **) 0x0
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
#0 0x00007ffff7fe2425 in do_remount_indirect (ap=0x7ffff821e070, fd=15,
|
|
Ian Kent |
5ec16e |
path=0x7ffff821e150 "/nfs/iil") at mounts.c:1212
|
|
Ian Kent |
5ec16e |
#1 0x00007ffff7fe2a48 in remount_active_mount (ap=0x7ffff821e070, mc=0x0,
|
|
Ian Kent |
5ec16e |
path=0x7ffff821e150 "/nfs/iil", devid=20, type=<optimized out>,
|
|
Ian Kent |
5ec16e |
ioctlfd=0x7ffff6e5babc) at mounts.c:1327
|
|
Ian Kent |
5ec16e |
#2 0x00007ffff7fe2ac6 in try_remount (ap=0x7ffff821e070, me=0x0, type=1)
|
|
Ian Kent |
5ec16e |
at mounts.c:1357
|
|
Ian Kent |
5ec16e |
#3 0x00007ffff7fd35e0 in do_mount_autofs_indirect (root=<optimized out>,
|
|
Ian Kent |
5ec16e |
ap=<optimized out>) at indirect.c:103
|
|
Ian Kent |
5ec16e |
#4 mount_autofs_indirect (ap=0x7ffff821e070, root=0x7ffff8202d50 "/nfs/iil")
|
|
Ian Kent |
5ec16e |
at indirect.c:213
|
|
Ian Kent |
5ec16e |
#5 0x00007ffff7fd1473 in mount_autofs (root=<optimized out>,
|
|
Ian Kent |
5ec16e |
ap=<optimized out>) at automount.c:1005
|
|
Ian Kent |
5ec16e |
#6 handle_mounts (arg=0x7fffffffdfd0) at automount.c:1526
|
|
Ian Kent |
5ec16e |
#7 0x00007ffff7b8e5f0 in start_thread (arg=<optimized out>)
|
|
Ian Kent |
5ec16e |
at pthread_create.c:297
|
|
Ian Kent |
5ec16e |
#8 0x00007ffff6f3187d in clone ()
|
|
Ian Kent |
5ec16e |
at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
|
|
Ian Kent |
5ec16e |
#9 0x0000000000000000 in ?? ()
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
Suggested fix:
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
Check scandir() return value
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
In some rare circumstance, it's possible that automount will crash
|
|
Ian Kent |
5ec16e |
on startup while trying to reconnect to a "half-broken" NFS mount
|
|
Ian Kent |
5ec16e |
point.
|
|
Ian Kent |
5ec16e |
---
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
CHANGELOG | 1 +
|
|
Ian Kent |
5ec16e |
lib/mounts.c | 4 ++++
|
|
Ian Kent |
5ec16e |
2 files changed, 5 insertions(+)
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
--- autofs-5.0.6.orig/CHANGELOG
|
|
Ian Kent |
5ec16e |
+++ autofs-5.0.6/CHANGELOG
|
|
Ian Kent |
5ec16e |
@@ -30,6 +30,7 @@
|
|
Ian Kent |
5ec16e |
- rework error return handling in rpc code.
|
|
Ian Kent |
5ec16e |
- catch EHOSTUNREACH and bail out early.
|
|
Ian Kent |
5ec16e |
- systemd support fixes.
|
|
Ian Kent |
5ec16e |
+- check scandir() return value.
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
28/06/2011 autofs-5.0.6
|
|
Ian Kent |
5ec16e |
-----------------------
|
|
Ian Kent |
5ec16e |
--- autofs-5.0.6.orig/lib/mounts.c
|
|
Ian Kent |
5ec16e |
+++ autofs-5.0.6/lib/mounts.c
|
|
Ian Kent |
5ec16e |
@@ -1355,6 +1355,10 @@ static int do_remount_indirect(struct au
|
|
Ian Kent |
5ec16e |
int i, j;
|
|
Ian Kent |
5ec16e |
|
|
Ian Kent |
5ec16e |
i = j = scandir(buf, &de2, 0, alphasort);
|
|
Ian Kent |
5ec16e |
+ if (i < 0) {
|
|
Ian Kent |
5ec16e |
+ free(de[n]);
|
|
Ian Kent |
5ec16e |
+ continue;
|
|
Ian Kent |
5ec16e |
+ }
|
|
Ian Kent |
5ec16e |
while (i--)
|
|
Ian Kent |
5ec16e |
free(de2[i]);
|
|
Ian Kent |
5ec16e |
free(de2);
|