]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph-fuse: fix leak of args
authorSage Weil <sage@inktank.com>
Fri, 9 Nov 2012 19:32:44 +0000 (11:32 -0800)
committerSage Weil <sage@inktank.com>
Sat, 10 Nov 2012 00:03:20 +0000 (16:03 -0800)
Also fix up the helper we use to have fewer sharp edges.

Signed-off-by: Sage Weil <sage@inktank.com>
src/ceph_fuse.cc
src/ceph_syn.cc
src/client/fuse_ll.cc
src/common/ceph_argparse.cc
src/common/ceph_argparse.h
src/testmsgr.cc

index bd3fc84167b751298148260e9dc759f4da12e443..e6457779e482ffe10d4d39ed1797a72402bba4e7 100644 (file)
@@ -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;
index 199be0eff620299c49e524f2a4451483a338f1ac..a087e9f4c9416adc96dce3e2ebde6e9b7372bd6e 100644 (file)
@@ -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)
index a9ac2f59796568eda66c84854c965c6cc2ec87ca..d70f0252bfdab790d5f219fb1733a72f16d56d4a 100644 (file)
@@ -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;
 }
index e6c8f7807c154b5ec9b475ffa55b157554c581aa..421fc3399e2ee35b0e3f1a34ad2be5d8b3b363aa 100644 (file)
@@ -78,20 +78,17 @@ void argv_to_vec(int argc, const char **argv,
     args.push_back(argv[i]);
 }
 
-void vec_to_argv(std::vector<const char*>& args,
-                 int& argc, const char **&argv)
+void vec_to_argv(const char *argv0, std::vector<const char*>& 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<args.size(); i++)
-    argv[argc++] = args[i];
+    (*argv)[(*argc)++] = args[i];
 }
 
 bool parse_ip_port_vec(const char *s, vector<entity_addr_t>& vec)
index fc7fb7b4993edc9bfe7598484c55f5c9f1606df9..fd9439c5627186579130c6a07d9191a408ed88a3 100644 (file)
@@ -46,8 +46,8 @@ public:
 extern void env_to_vec(std::vector<const char*>& args, const char *name=NULL);
 extern void argv_to_vec(int argc, const char **argv,
                  std::vector<const char*>& args);
-extern void vec_to_argv(std::vector<const char*>& args,
-                 int& argc, const char **&argv);
+extern void vec_to_argv(const char *argv0, std::vector<const char*>& args,
+                       int *argc, const char ***argv);
 
 extern bool parse_ip_port_vec(const char *s, std::vector<entity_addr_t>& vec);
 bool ceph_argparse_double_dash(std::vector<const char*> &args,
index e6d13250effab272d97b4da87e40788896b92c49..eb716b9013e52cdd27bb199913474638bbbf018d 100644 (file)
@@ -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