Fix memory leak in disk redirection

We kept allocating a data buffer for this stream in each call,
but never freeing it.
This commit is contained in:
Pierre Ossman 2019-04-12 13:56:03 +02:00
parent 25b8412333
commit f19c21d7d1

57
disk.c
View File

@ -1131,10 +1131,7 @@ disk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
struct STATFS_T stat_fs; struct STATFS_T stat_fs;
struct fileinfo *pfinfo; struct fileinfo *pfinfo;
FsInfoType *fsinfo; FsInfoType *fsinfo;
struct stream stmp; STREAM stmp;
memset(&stmp, 0, sizeof(stmp));
s_realloc(&stmp, PATH_MAX * 4);
logger(Disk, Debug, "disk_query_volume_information(handle=0x%x, info_class=0x%x)", handle, logger(Disk, Debug, "disk_query_volume_information(handle=0x%x, info_class=0x%x)", handle,
info_class); info_class);
@ -1153,16 +1150,17 @@ disk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
switch (info_class) switch (info_class)
{ {
case FileFsVolumeInformation: case FileFsVolumeInformation:
s_reset(&stmp); stmp = s_alloc(PATH_MAX * 4);
out_utf16s(&stmp, fsinfo->label); out_utf16s(stmp, fsinfo->label);
s_mark_end(&stmp); s_mark_end(stmp);
out_uint32_le(out, 0); /* volume creation time low */ out_uint32_le(out, 0); /* volume creation time low */
out_uint32_le(out, 0); /* volume creation time high */ out_uint32_le(out, 0); /* volume creation time high */
out_uint32_le(out, fsinfo->serial); /* serial */ out_uint32_le(out, fsinfo->serial); /* serial */
out_uint32_le(out, s_length(&stmp)); /* length of string */ out_uint32_le(out, s_length(stmp)); /* length of string */
out_uint8(out, 0); /* support objects? */ out_uint8(out, 0); /* support objects? */
out_stream(out, &stmp); /* fsinfo->label string */ out_stream(out, stmp); /* fsinfo->label string */
s_free(stmp);
break; break;
case FileFsSizeInformation: case FileFsSizeInformation:
@ -1183,15 +1181,16 @@ disk_query_volume_information(RD_NTHANDLE handle, uint32 info_class, STREAM out)
break; break;
case FileFsAttributeInformation: case FileFsAttributeInformation:
s_reset(&stmp); stmp = s_alloc(PATH_MAX * 4);
out_utf16s_no_eos(&stmp, fsinfo->type); out_utf16s_no_eos(stmp, fsinfo->type);
s_mark_end(&stmp); s_mark_end(stmp);
out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED); /* fs attributes */ out_uint32_le(out, FS_CASE_SENSITIVE | FS_CASE_IS_PRESERVED); /* fs attributes */
out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */ out_uint32_le(out, F_NAMELEN(stat_fs)); /* max length of filename */
out_uint32_le(out, s_length(&stmp)); /* length of fsinfo->type string */ out_uint32_le(out, s_length(stmp)); /* length of fsinfo->type string */
out_stream(out, &stmp); /* fsinfo->typ string */ out_stream(out, stmp); /* fsinfo->typ string */
s_free(stmp);
break; break;
case FileFsLabelInformation: case FileFsLabelInformation:
@ -1218,7 +1217,7 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
struct dirent *pdirent; struct dirent *pdirent;
struct stat filestat; struct stat filestat;
struct fileinfo *pfinfo; struct fileinfo *pfinfo;
struct stream stmp; STREAM stmp;
logger(Disk, Debug, "disk_query_directory(handle=0x%x, info_class=0x%x, pattern=%s, ...)", logger(Disk, Debug, "disk_query_directory(handle=0x%x, info_class=0x%x, pattern=%s, ...)",
handle, info_class, pattern); handle, info_class, pattern);
@ -1228,9 +1227,6 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
dirname = pfinfo->path; dirname = pfinfo->path;
file_attributes = 0; file_attributes = 0;
memset(&stmp, 0, sizeof(stmp));
s_realloc(&stmp, PATH_MAX * 4);
switch (info_class) switch (info_class)
{ {
case FileBothDirectoryInformation: case FileBothDirectoryInformation:
@ -1299,9 +1295,9 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
} }
// Write entry name as utf16 into stmp // Write entry name as utf16 into stmp
s_reset(&stmp); stmp = s_alloc(PATH_MAX * 4);
out_utf16s_no_eos(&stmp, pdirent->d_name); out_utf16s_no_eos(stmp, pdirent->d_name);
s_mark_end(&stmp); s_mark_end(stmp);
switch (info_class) switch (info_class)
{ {
@ -1327,11 +1323,11 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint32_le(out, file_attributes); /* FileAttributes */ out_uint32_le(out, file_attributes); /* FileAttributes */
out_uint32_le(out, s_length(&stmp)); /* length of dir entry name string */ out_uint32_le(out, s_length(stmp)); /* length of dir entry name string */
out_uint32_le(out, 0); /* EaSize */ out_uint32_le(out, 0); /* EaSize */
out_uint8(out, 0); /* ShortNameLength */ out_uint8(out, 0); /* ShortNameLength */
out_uint8s(out, 24); /* ShortName (8.3 name) */ out_uint8s(out, 24); /* ShortName (8.3 name) */
out_stream(out, &stmp); /* dir entry name string */ out_stream(out, stmp); /* dir entry name string */
break; break;
@ -1357,8 +1353,8 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint32_le(out, file_attributes); out_uint32_le(out, file_attributes);
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */ out_uint32_le(out, s_length(stmp)); /* dir entry name string length */
out_stream(out, &stmp); /* dir entry name */ out_stream(out, stmp); /* dir entry name */
break; break;
@ -1384,16 +1380,16 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint64_le(out, filestat.st_size); /* filesize */ out_uint64_le(out, filestat.st_size); /* filesize */
out_uint32_le(out, file_attributes); out_uint32_le(out, file_attributes);
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */ out_uint32_le(out, s_length(stmp)); /* dir entry name string length */
out_uint32_le(out, 0); /* EaSize */ out_uint32_le(out, 0); /* EaSize */
out_stream(out, &stmp); /* dir entry name */ out_stream(out, stmp); /* dir entry name */
break; break;
case FileNamesInformation: case FileNamesInformation:
out_uint32_le(out, s_length(&stmp)); /* dir entry name string length */ out_uint32_le(out, s_length(stmp)); /* dir entry name string length */
out_stream(out, &stmp); /* dir entry name */ out_stream(out, stmp); /* dir entry name */
break; break;
@ -1401,9 +1397,12 @@ disk_query_directory(RD_NTHANDLE handle, uint32 info_class, char *pattern, STREA
logger(Disk, Warning, logger(Disk, Warning,
"disk_query_directory(), unhandled directory info class 0x%x", "disk_query_directory(), unhandled directory info class 0x%x",
info_class); info_class);
s_free(stmp);
return RD_STATUS_INVALID_PARAMETER; return RD_STATUS_INVALID_PARAMETER;
} }
s_free(stmp);
return RD_STATUS_SUCCESS; return RD_STATUS_SUCCESS;
} }