From b0bafbb5d106d7dcaebbf76c97fc8e1daaa2e718 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 23 Jun 2011 13:10:28 +0200 Subject: [PATCH] Do not allocate tiny cap_user_header/data structures, place them on stack. This allows us to avoid having code to malloc them, and code to check for malloc failure. Resulting code decrease: text data bss dec hex filename 10175 0 16 10191 27cf system.o.old 9797 0 0 9797 2645 system.o * system.c (sys_capget): Put cap_user_header_t and cap_user_data_t on stack, rather than allocating them in heap. These structures are very small (a few integer fields), stack is a better place for them. (sys_capset): Likewise. Signed-off-by: Denys Vlasenko --- system.c | 49 +++++++++++++++---------------------------------- 1 file changed, 15 insertions(+), 34 deletions(-) diff --git a/system.c b/system.c index 9176697d..e35c1175 100644 --- a/system.c +++ b/system.c @@ -1572,25 +1572,17 @@ static const struct xlat capabilities[] = { int sys_capget(struct tcb *tcp) { - static cap_user_header_t arg0 = NULL; - static cap_user_data_t arg1 = NULL; + /* cap_user_ types are _pointers_ to (small) structs. */ + /* Structs themselves have no names defined. */ + /* Have to use ugly hack to place them on stack. */ + cap_user_header_t arg0; + cap_user_data_t arg1; + long a0[sizeof(*arg0) / sizeof(long) + 1]; + long a1[sizeof(*arg1) / sizeof(long) + 1]; + arg0 = (cap_user_header_t*) &a0; + arg1 = (cap_user_data_t *) &a1; if (!entering(tcp)) { - if (!arg0) { - if ((arg0 = malloc(sizeof(*arg0))) == NULL) { - fprintf(stderr, "out of memory\n"); - tprintf("%#lx, %#lx", tcp->u_arg[0], tcp->u_arg[1]); - return -1; - } - } - if (!arg1) { - if ((arg1 = malloc(sizeof(*arg1))) == NULL) { - fprintf(stderr, "out of memory\n"); - tprintf("%#lx, %#lx", tcp->u_arg[0], tcp->u_arg[1]); - return -1; - } - } - if (!tcp->u_arg[0]) tprintf("NULL"); else if (!verbose(tcp)) @@ -1623,25 +1615,14 @@ sys_capget(struct tcb *tcp) int sys_capset(struct tcb *tcp) { - static cap_user_header_t arg0 = NULL; - static cap_user_data_t arg1 = NULL; + cap_user_header_t arg0; + cap_user_data_t arg1; + long a0[sizeof(*arg0) / sizeof(long) + 1]; + long a1[sizeof(*arg1) / sizeof(long) + 1]; + arg0 = (cap_user_header_t*) &a0; + arg1 = (cap_user_data_t *) &a1; if (entering(tcp)) { - if (!arg0) { - if ((arg0 = malloc(sizeof(*arg0))) == NULL) { - fprintf(stderr, "out of memory\n"); - tprintf("%#lx, %#lx", tcp->u_arg[0], tcp->u_arg[1]); - return -1; - } - } - if (!arg1) { - if ((arg1 = malloc(sizeof(*arg1))) == NULL) { - fprintf(stderr, "out of memory\n"); - tprintf("%#lx, %#lx", tcp->u_arg[0], tcp->u_arg[1]); - return -1; - } - } - if (!tcp->u_arg[0]) tprintf("NULL"); else if (!verbose(tcp)) -- 2.40.0