From: Sage Weil Date: Fri, 9 Nov 2012 19:32:44 +0000 (-0800) Subject: ceph-fuse: fix leak of args X-Git-Tag: v0.54~7^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a8053c10d9a6f51665124730eeb16f0cb75c60f5;p=ceph.git ceph-fuse: fix leak of args Also fix up the helper we use to have fewer sharp edges. Signed-off-by: Sage Weil --- diff --git a/src/ceph_fuse.cc b/src/ceph_fuse.cc index bd3fc84167b75..e6457779e482f 100644 --- a/src/ceph_fuse.cc +++ b/src/ceph_fuse.cc @@ -66,7 +66,9 @@ int main(int argc, const char **argv, const char *envp[]) { } // args for fuse - vec_to_argv(args, argc, argv); + const char **newargv; + int newargc; + vec_to_argv(argv[0], args, &newargc, &newargv); // FUSE will chdir("/"); be ready. g_ceph_context->_conf->set_val("chdir", "/"); @@ -152,7 +154,7 @@ int main(int argc, const char **argv, const char *envp[]) { } cerr << "ceph-fuse[" << getpid() << "]: starting fuse" << std::endl; - r = ceph_fuse_ll_main(client, argc, argv, fd[1]); + r = ceph_fuse_ll_main(client, newargc, newargv, fd[1]); cerr << "ceph-fuse[" << getpid() << "]: fuse finished with error " << r << std::endl; client->unmount(); @@ -175,6 +177,7 @@ int main(int argc, const char **argv, const char *envp[]) { delete messenger; g_ceph_context->put(); + free(newargv); //cout << "child done" << std::endl; return r; diff --git a/src/ceph_syn.cc b/src/ceph_syn.cc index 199be0eff6202..a087e9f4c9416 100644 --- a/src/ceph_syn.cc +++ b/src/ceph_syn.cc @@ -54,8 +54,6 @@ int main(int argc, const char **argv, char *envp[]) pick_addresses(g_ceph_context); - vec_to_argv(args, argc, argv); - // get monmap MonClient mc(g_ceph_context); if (mc.build_initial_monmap() < 0) diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index a9ac2f5979656..d70f0252bfdab 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -623,6 +623,7 @@ done: if (ch) fuse_unmount(mountpoint, ch); fuse_opt_free_args(&args); + free(newargv); //cout << "ceph_fuse_ll_main done, err=" << err << std::endl; return ret; } diff --git a/src/common/ceph_argparse.cc b/src/common/ceph_argparse.cc index e6c8f7807c154..421fc3399e2ee 100644 --- a/src/common/ceph_argparse.cc +++ b/src/common/ceph_argparse.cc @@ -78,20 +78,17 @@ void argv_to_vec(int argc, const char **argv, args.push_back(argv[i]); } -void vec_to_argv(std::vector& args, - int& argc, const char **&argv) +void vec_to_argv(const char *argv0, std::vector& args, + int *argc, const char ***argv) { - const char *myname = "asdf"; - if (argc && argv) - myname = argv[0]; - argv = (const char**)malloc(sizeof(char*) * argc); + *argv = (const char**)malloc(sizeof(char*) * (args.size() + 1)); if (!argv) throw bad_alloc(); - argc = 1; - argv[0] = myname; + *argc = 1; + (*argv)[0] = argv0; for (unsigned i=0; i& vec) diff --git a/src/common/ceph_argparse.h b/src/common/ceph_argparse.h index fc7fb7b4993ed..fd9439c562718 100644 --- a/src/common/ceph_argparse.h +++ b/src/common/ceph_argparse.h @@ -46,8 +46,8 @@ public: extern void env_to_vec(std::vector& args, const char *name=NULL); extern void argv_to_vec(int argc, const char **argv, std::vector& args); -extern void vec_to_argv(std::vector& args, - int& argc, const char **&argv); +extern void vec_to_argv(const char *argv0, std::vector& args, + int *argc, const char ***argv); extern bool parse_ip_port_vec(const char *s, std::vector& vec); bool ceph_argparse_double_dash(std::vector &args, diff --git a/src/testmsgr.cc b/src/testmsgr.cc index e6d13250effab..eb716b9013e52 100644 --- a/src/testmsgr.cc +++ b/src/testmsgr.cc @@ -80,8 +80,6 @@ int main(int argc, const char **argv, const char *envp[]) { global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); common_init_finish(g_ceph_context); - vec_to_argv(args, argc, argv); - dout(0) << "i am mon " << args[0] << dendl; // get monmap