[DRBD-cvs] svn commit by lars - r1992 - branches/drbd-0.7/user - fix off-by-one in special-case code (environment __DRBD

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Fri Oct 21 14:47:27 CEST 2005


Author: lars
Date: 2005-10-21 14:47:26 +0200 (Fri, 21 Oct 2005)
New Revision: 1992

Modified:
   branches/drbd-0.7/user/drbdadm_main.c
Log:
fix off-by-one in special-case code (environment __DRBD_NODE__ exists)

improve selection of drbdsetup binary to use.
(security related: ./drbdsetup preference had been hardcoded...)



Modified: branches/drbd-0.7/user/drbdadm_main.c
===================================================================
--- branches/drbd-0.7/user/drbdadm_main.c	2005-10-18 10:09:48 UTC (rev 1991)
+++ branches/drbd-0.7/user/drbdadm_main.c	2005-10-21 12:47:26 UTC (rev 1992)
@@ -394,16 +394,21 @@
   struct stat buf;
   char **path;
 
+  if (drbdsetup) {
+    free(drbdsetup);
+    drbdsetup = NULL;
+  }
+
   path=pathes;
   while(*path) {
     if(stat(*path,&buf)==0) {
-      drbdsetup=*path;
+      drbdsetup = strdup(*path);
       return;
     }
     path++;
   }
 
-  fprintf(stderr,"Can not find drbdsetup");
+  fprintf(stderr,"Can not find drbdsetup\n");
   exit(E_exec_error);
 }
 
@@ -439,7 +444,7 @@
     exit(E_exec_error);
   }
   if(pid == 0) {
-    execv(argv[0],argv);
+    execvp(argv[0],argv);
     fprintf(stderr,"Can not exec\n");
     exit(E_exec_error);
   }
@@ -1159,7 +1164,6 @@
   struct d_resource *res,*tmp;
   char *env_drbd_nodename = NULL;
 
-  drbdsetup=NULL;
   dry_run=0;
   yyin=NULL;
   uname(&nodeinfo); /* FIXME maybe fold to lower case ? */
@@ -1167,18 +1171,36 @@
   env_drbd_nodename = getenv("__DRBD_NODE__");
   if (env_drbd_nodename && *env_drbd_nodename) {
     strncpy(nodeinfo.nodename,env_drbd_nodename,sizeof(nodeinfo.nodename)-1);
-    nodeinfo.nodename[sizeof(nodeinfo.nodename)] = 0;
+    nodeinfo.nodename[sizeof(nodeinfo.nodename)-1] = 0;
     fprintf(stderr, "\n"
             "   found __DRBD_NODE__ in environment\n"
             "   PRETENDING that I am >>%s<<\n\n",nodeinfo.nodename);
   }
 
-  if( (progname=strrchr(argv[0],'/')) )
-    argv[0] = ++progname;
-  else
-    progname=argv[0];
   if(argc == 1) print_usage_and_exit("missing arguments"); // arguments missing.
 
+  /* in case drbdadm is called with an absolut or relative pathname
+   * look for the drbdsetup binary in the same location,
+   * otherwise, just let execvp sort it out... */
+  if( (progname=strrchr(argv[0],'/')) == 0 ) {
+    progname=argv[0];
+    drbdsetup = strdup("drbdsetup");
+  } else {
+    size_t len = strlen(argv[0]) + 1;
+    ++progname;
+    len += strlen("drbdsetup") - strlen(progname);
+    drbdsetup = malloc(len);
+    if (drbdsetup) {
+      strncpy(drbdsetup, argv[0], (progname - argv[0]));
+      strcpy(drbdsetup + (progname - argv[0]), "drbdsetup");
+    }
+    argv[0] = progname;
+  }
+  if (drbdsetup == NULL) {
+    fprintf(stderr,"could not strdup argv[0].\n");
+    exit(E_exec_error);
+  }
+
   opterr=1;
   optind=0;
   while(1)
@@ -1314,10 +1336,6 @@
     }
   }
 
-  if(drbdsetup == NULL) {
-    find_drbdsetup((char *[]){"./drbdsetup", "/sbin/drbdsetup", 0 });
-  }
-
   if(cmd->res_name_required)
     {
       int is_dump = (cmd->function == adm_dump);



More information about the drbd-cvs mailing list