Added check on directory in Local_Storage::file_exists

Added check on directory in Local_Storage::file_exists.
Added check in get_filenames_recursive if last char is the path separator (some use cases were adding a path separator even if there were already one).

In base.h, added check on s and r, that will avoid an out-of-range vector exception on Visual Studio, same for network.cpp.
This commit is contained in:
Nemirtingas 2019-06-17 23:08:23 +02:00
parent b093ca90d3
commit e54072918f
3 changed files with 15 additions and 4 deletions

View file

@ -93,6 +93,7 @@ struct Steam_Call_Result {
Steam_Call_Result(SteamAPICall_t a, int icb, void *r, unsigned int s, double r_in, bool run_cc_cb) { Steam_Call_Result(SteamAPICall_t a, int icb, void *r, unsigned int s, double r_in, bool run_cc_cb) {
api_call = a; api_call = a;
result.resize(s); result.resize(s);
if (s > 0 && r != NULL)
memcpy(&(result[0]), r, s); memcpy(&(result[0]), r, s);
created = std::chrono::high_resolution_clock::now(); created = std::chrono::high_resolution_clock::now();
run_in = r_in; run_in = r_in;

View file

@ -192,6 +192,8 @@ static std::vector<struct File_Data> get_filenames(std::string strPath)
static std::vector<struct File_Data> get_filenames_recursive(std::string base_path) static std::vector<struct File_Data> get_filenames_recursive(std::string base_path)
{ {
if (base_path.back() == *PATH_SEPARATOR)
base_path.pop_back();
std::vector<struct File_Data> output; std::vector<struct File_Data> output;
std::string strPath = base_path; std::string strPath = base_path;
strPath = strPath.append("\\*"); strPath = strPath.append("\\*");
@ -211,10 +213,11 @@ static std::vector<struct File_Data> get_filenames_recursive(std::string base_pa
std::string dir_name = ffd.cFileName; std::string dir_name = ffd.cFileName;
std::string path = base_path; std::string path = base_path;
path += "\\"; path += PATH_SEPARATOR;
path += dir_name; path += dir_name;
std::vector<struct File_Data> lower = get_filenames_recursive(path); std::vector<struct File_Data> lower = get_filenames_recursive(path);
// output.push_back(File_Data{ dir_name }); Is this needed ? Add folder name to the list of files ?
std::transform(lower.begin(), lower.end(), std::back_inserter(output), [dir_name](File_Data f) {f.name = dir_name + "\\" + f.name; return f;}); std::transform(lower.begin(), lower.end(), std::back_inserter(output), [dir_name](File_Data f) {f.name = dir_name + "\\" + f.name; return f;});
} else { } else {
File_Data f; File_Data f;
@ -584,6 +587,10 @@ bool Local_Storage::file_exists(std::string folder, std::string file)
std::string full_path = save_directory + appid + folder + file; std::string full_path = save_directory + appid + folder + file;
struct stat buffer; struct stat buffer;
if (GetFileAttributes(full_path.c_str()) & FILE_ATTRIBUTE_DIRECTORY)
return false;
return (stat (full_path.c_str(), &buffer) == 0); return (stat (full_path.c_str(), &buffer) == 0);
} }
@ -636,7 +643,7 @@ bool Local_Storage::iterate_file(std::string folder, int index, char *output_fil
std::string name = desanitize_file_name(files[index].name); std::string name = desanitize_file_name(files[index].name);
if (output_size) *output_size = file_size(folder, name); if (output_size) *output_size = file_size(folder, name);
#if defined(STEAM_WIN32) #if defined(STEAM_WIN32)
name = replace_with(name, "/", PATH_SEPARATOR); name = replace_with(name, PATH_SEPARATOR, "/");
#endif #endif
strcpy(output_filename, name.c_str()); strcpy(output_filename, name.c_str());
return true; return true;

View file

@ -379,7 +379,10 @@ unsigned int receive_buffer_amount(sock_t sock)
static void send_tcp_pending(struct TCP_Socket &socket) static void send_tcp_pending(struct TCP_Socket &socket)
{ {
int len = send(socket.sock, &(socket.send_buffer[0]), socket.send_buffer.size(), MSG_NOSIGNAL); size_t buf_size = socket.send_buffer.size();
if (buf_size == 0) return;
int len = send(socket.sock, &(socket.send_buffer[0]), buf_size, MSG_NOSIGNAL);
if (len <= 0) return; if (len <= 0) return;
socket.send_buffer.erase(socket.send_buffer.begin(), socket.send_buffer.begin() + len); socket.send_buffer.erase(socket.send_buffer.begin(), socket.send_buffer.begin() + len);