Don't retrieve files that start with ..' or
/' without asking.
Reverse test in confirm() to check for `y' rather than not `n'. Use mkstemp. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3807 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -562,10 +562,12 @@ int
|
||||
getit(int argc, char **argv, int restartit, char *mode)
|
||||
{
|
||||
int loc = 0;
|
||||
int local_given = 1;
|
||||
char *oldargv1, *oldargv2;
|
||||
|
||||
if (argc == 2) {
|
||||
argc++;
|
||||
local_given = 0;
|
||||
argv[2] = argv[1];
|
||||
loc++;
|
||||
}
|
||||
@@ -656,7 +658,7 @@ usage:
|
||||
}
|
||||
|
||||
recvrequest("RETR", argv[2], argv[1], mode,
|
||||
argv[1] != oldargv1 || argv[2] != oldargv2, argv[2] != NULL);
|
||||
argv[1] != oldargv1 || argv[2] != oldargv2, local_given);
|
||||
restart_point = 0;
|
||||
return (0);
|
||||
}
|
||||
@@ -718,61 +720,78 @@ mget(int argc, char **argv)
|
||||
char *
|
||||
remglob(char **argv, int doswitch)
|
||||
{
|
||||
char temp[16];
|
||||
static char buf[MaxPathLen];
|
||||
static FILE *ftemp = NULL;
|
||||
static char **args;
|
||||
int oldverbose, oldhash;
|
||||
char *cp, *mode;
|
||||
char temp[16];
|
||||
static char buf[MaxPathLen];
|
||||
static FILE *ftemp = NULL;
|
||||
static char **args;
|
||||
int oldverbose, oldhash;
|
||||
char *cp, *mode;
|
||||
|
||||
if (!mflag) {
|
||||
if (!doglob) {
|
||||
args = NULL;
|
||||
}
|
||||
else {
|
||||
if (ftemp) {
|
||||
fclose(ftemp);
|
||||
ftemp = NULL;
|
||||
}
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
if (!mflag) {
|
||||
if (!doglob) {
|
||||
if (args == NULL)
|
||||
args = argv;
|
||||
if ((cp = *++args) == NULL)
|
||||
args = NULL;
|
||||
return (cp);
|
||||
args = NULL;
|
||||
}
|
||||
if (ftemp == NULL) {
|
||||
strcpy(temp, _PATH_TMP_XXX);
|
||||
mktemp(temp);
|
||||
oldverbose = verbose, verbose = 0;
|
||||
oldhash = hash, hash = 0;
|
||||
if (doswitch) {
|
||||
pswitch(!proxy);
|
||||
}
|
||||
for (mode = "w"; *++argv != NULL; mode = "a")
|
||||
recvrequest ("NLST", temp, *argv, mode, 0, 0);
|
||||
if (doswitch) {
|
||||
pswitch(!proxy);
|
||||
}
|
||||
verbose = oldverbose; hash = oldhash;
|
||||
ftemp = fopen(temp, "r");
|
||||
unlink(temp);
|
||||
if (ftemp == NULL) {
|
||||
printf("can't find list of remote files, oops\n");
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
if (fgets(buf, sizeof (buf), ftemp) == NULL) {
|
||||
else {
|
||||
if (ftemp) {
|
||||
fclose(ftemp);
|
||||
ftemp = NULL;
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
if ((cp = strchr(buf, '\n')) != NULL)
|
||||
*cp = '\0';
|
||||
return (buf);
|
||||
return (NULL);
|
||||
}
|
||||
if (!doglob) {
|
||||
if (args == NULL)
|
||||
args = argv;
|
||||
if ((cp = *++args) == NULL)
|
||||
args = NULL;
|
||||
return (cp);
|
||||
}
|
||||
if (ftemp == NULL) {
|
||||
int fd;
|
||||
strcpy(temp, _PATH_TMP_XXX);
|
||||
fd = mkstemp(temp);
|
||||
if(fd < 0){
|
||||
warn("unable to create temporary file %s", temp);
|
||||
return NULL;
|
||||
}
|
||||
close(fd);
|
||||
oldverbose = verbose, verbose = 0;
|
||||
oldhash = hash, hash = 0;
|
||||
if (doswitch) {
|
||||
pswitch(!proxy);
|
||||
}
|
||||
for (mode = "w"; *++argv != NULL; mode = "a")
|
||||
recvrequest ("NLST", temp, *argv, mode, 0, 0);
|
||||
if (doswitch) {
|
||||
pswitch(!proxy);
|
||||
}
|
||||
verbose = oldverbose; hash = oldhash;
|
||||
ftemp = fopen(temp, "r");
|
||||
unlink(temp);
|
||||
if (ftemp == NULL) {
|
||||
printf("can't find list of remote files, oops\n");
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
next:
|
||||
if (fgets(buf, sizeof (buf), ftemp) == NULL) {
|
||||
fclose(ftemp);
|
||||
ftemp = NULL;
|
||||
return (NULL);
|
||||
}
|
||||
if ((cp = strchr(buf, '\n')) != NULL)
|
||||
*cp = '\0';
|
||||
if(strncmp(buf, "../", 3) == 0 || *buf == '/'){
|
||||
if(interactive == 0){
|
||||
printf("Ignoring remote globbed file `%s'\n", buf);
|
||||
goto next;
|
||||
}
|
||||
if(!confirm(buf, *buf == '/' ?
|
||||
" - retrieve file starting with `/'" :
|
||||
" - retrieve file starting with `..'"))
|
||||
goto next;
|
||||
}
|
||||
return (buf);
|
||||
}
|
||||
|
||||
char *
|
||||
@@ -1484,7 +1503,7 @@ confirm(char *cmd, char *file)
|
||||
fflush(stdout);
|
||||
if (fgets(line, sizeof line, stdin) == NULL)
|
||||
return (0);
|
||||
return (*line != 'n' && *line != 'N');
|
||||
return (*line == 'y' || *line == 'Y');
|
||||
}
|
||||
|
||||
void
|
||||
|
Reference in New Issue
Block a user