[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