Messages in this thread Patch in this message | | | Subject | [PATCH] remove_arg_zero() rewrite | From | Peter Zijlstra <> | Date | Wed, 07 Mar 2007 23:09:57 +0100 |
| |
On Wed, 2007-02-21 at 15:41 -0800, Andrew Morton wrote:
> I mean.... what the hell? > > As you appear to have managed to work out what the sorry thing is trying to > do, would you have time to simply rip it out and completely rewrite it, > including a nice comment telling the world what this function's function is? > > Because what we have there is beyond repairing.
Something like so? Boots uml seemingly without errors.
--- Rewrite remove_arg_zero() to be more parseable by untwisted minds.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> --- fs/exec.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-)
Index: linux-2.6/fs/exec.c =================================================================== --- linux-2.6.orig/fs/exec.c 2007-03-07 21:54:17.000000000 +0100 +++ linux-2.6/fs/exec.c 2007-03-07 23:08:27.000000000 +0100 @@ -987,28 +987,34 @@ void compute_creds(struct linux_binprm * EXPORT_SYMBOL(compute_creds); +/* + * Arguments are '\0' separated strings found at the location bprm->p + * points to; chop off the first by relocating brpm->p to right after + * the first '\0' encountered. + */ void remove_arg_zero(struct linux_binprm *bprm) { - if (bprm->argc) { - unsigned long offset; - char * kaddr; - struct page *page; + unsigned long offset; + char *kaddr; + struct page *page; - offset = bprm->p % PAGE_SIZE; - goto inside; + if (!bprm->argc) + return; + + do { + offset = bprm->p & ~PAGE_MASK; + page = bprm->page[bprm->p >> PAGE_SHIFT]; + kaddr = kmap_atomic(page, KM_USER0); + + for (; offset < PAGE_SIZE && kaddr[offset]; + offset++, bprm->p++) + ; - while (bprm->p++, *(kaddr+offset++)) { - if (offset != PAGE_SIZE) - continue; - offset = 0; - kunmap_atomic(kaddr, KM_USER0); -inside: - page = bprm->page[bprm->p/PAGE_SIZE]; - kaddr = kmap_atomic(page, KM_USER0); - } kunmap_atomic(kaddr, KM_USER0); - bprm->argc--; - } + } while (offset == PAGE_SIZE); + + bprm->p++; + bprm->argc--; } EXPORT_SYMBOL(remove_arg_zero);
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |