mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 17:38:00 +00:00
Fix major memory leak in sftp_cmd_ls (thanks to Hans-Juergen Petrich
for pointing it out). [originally from svn r1612]
This commit is contained in:
parent
01ca464ad2
commit
ae2599845c
18
psftp.c
18
psftp.c
@ -188,15 +188,15 @@ int sftp_cmd_quit(struct sftp_command *cmd)
|
||||
*/
|
||||
static int sftp_ls_compare(const void *av, const void *bv)
|
||||
{
|
||||
const struct fxp_name *a = (const struct fxp_name *) av;
|
||||
const struct fxp_name *b = (const struct fxp_name *) bv;
|
||||
return strcmp(a->filename, b->filename);
|
||||
const struct fxp_name *const *a = (const struct fxp_name *const *) av;
|
||||
const struct fxp_name *const *b = (const struct fxp_name *const *) bv;
|
||||
return strcmp((*a)->filename, (*b)->filename);
|
||||
}
|
||||
int sftp_cmd_ls(struct sftp_command *cmd)
|
||||
{
|
||||
struct fxp_handle *dirh;
|
||||
struct fxp_names *names;
|
||||
struct fxp_name *ournames;
|
||||
struct fxp_name **ournames;
|
||||
int nnames, namesize;
|
||||
char *dir, *cdir;
|
||||
int i;
|
||||
@ -247,9 +247,8 @@ int sftp_cmd_ls(struct sftp_command *cmd)
|
||||
}
|
||||
|
||||
for (i = 0; i < names->nnames; i++)
|
||||
ournames[nnames++] = names->names[i];
|
||||
ournames[nnames++] = fxp_dup_name(&names->names[i]);
|
||||
|
||||
names->nnames = 0; /* prevent free_names */
|
||||
fxp_free_names(names);
|
||||
}
|
||||
fxp_close(dirh);
|
||||
@ -263,8 +262,11 @@ int sftp_cmd_ls(struct sftp_command *cmd)
|
||||
/*
|
||||
* And print them.
|
||||
*/
|
||||
for (i = 0; i < nnames; i++)
|
||||
printf("%s\n", ournames[i].longname);
|
||||
for (i = 0; i < nnames; i++) {
|
||||
printf("%s\n", ournames[i]->longname);
|
||||
fxp_free_name(ournames[i]);
|
||||
}
|
||||
sfree(ournames);
|
||||
}
|
||||
|
||||
sfree(cdir);
|
||||
|
25
sftp.c
25
sftp.c
@ -923,3 +923,28 @@ void fxp_free_names(struct fxp_names *names)
|
||||
sfree(names->names);
|
||||
sfree(names);
|
||||
}
|
||||
|
||||
/*
|
||||
* Duplicate an fxp_name structure.
|
||||
*/
|
||||
struct fxp_name *fxp_dup_name(struct fxp_name *name)
|
||||
{
|
||||
struct fxp_name *ret;
|
||||
ret = smalloc(sizeof(struct fxp_name));
|
||||
ret->filename = dupstr(name->filename);
|
||||
ret->longname = dupstr(name->longname);
|
||||
ret->attrs = name->attrs; /* structure copy */
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free up an fxp_name structure.
|
||||
*/
|
||||
void fxp_free_name(struct fxp_name *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
sfree(name->filename);
|
||||
sfree(name->longname);
|
||||
sfree(name);
|
||||
}
|
||||
|
6
sftp.h
6
sftp.h
@ -174,3 +174,9 @@ struct fxp_names *fxp_readdir(struct fxp_handle *handle);
|
||||
* Free up an fxp_names structure.
|
||||
*/
|
||||
void fxp_free_names(struct fxp_names *names);
|
||||
|
||||
/*
|
||||
* Duplicate and free fxp_name structures.
|
||||
*/
|
||||
struct fxp_name *fxp_dup_name(struct fxp_name *name);
|
||||
void fxp_free_name(struct fxp_name *name);
|
||||
|
Loading…
Reference in New Issue
Block a user