X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fnetwork.c;h=cd004f62f8f3ad732b72d91288940b2d6fcc53d0;hp=bf12567b4bbc5836fa0b5502a96cfd3dbd5dfb5e;hb=9fe7d0e238a00bba4a9a9a9a11e954942741f3a3;hpb=796c49130a11576aeb603104bdd25a6020598761 diff --git a/src/network.c b/src/network.c index bf12567b..cd004f62 100644 --- a/src/network.c +++ b/src/network.c @@ -38,15 +38,6 @@ static struct NetworkClientPlayerInfo first_player = NULL }; -struct NetworkLevelFileInfo -{ - char *leveldir_identifier; - struct LevelFileInfo file_info; - struct LevelFileInfo tmpl_info; - boolean use_network_level_files; - boolean use_custom_template; -}; - /* server stuff */ static TCPsocket sfd; /* TCP server socket */ @@ -60,7 +51,7 @@ static boolean stop_network_game = FALSE; static boolean stop_network_client = FALSE; static char stop_network_client_message[MAX_OUTPUT_LINESIZE + 1]; -static struct NetworkLevelFileInfo network_level; +static struct NetworkLevelInfo network_level; static void DrawNetworkTextExt(char *message, int font_nr, boolean initialize) { @@ -182,6 +173,11 @@ char *getNetworkPlayerName(int player_nr) return(EMPTY_PLAYER_NAME); } +static boolean hasPathSeparator(char *s) +{ + return (strchr(s, '/') != NULL); +} + static void StartNetworkServer(int port) { static int p; @@ -694,16 +690,13 @@ static void Handle_OP_START_PLAYING() level_nr = new_level_nr; } - SetLevelSetInfo(new_leveldir_identifier, new_level_nr); - /* needed if level set of network game changed graphics, sounds or music */ ReloadCustomArtwork(0); TapeErase(); if (network_level.use_network_level_files) - LoadLevelFromNetwork(&network_level.file_info, - &network_level.tmpl_info); + LoadNetworkLevel(&network_level); else LoadLevel(level_nr); @@ -754,11 +747,12 @@ static void Handle_OP_STOP_PLAYING() boolean stopped_by_remote_player = (!client_player->connected_locally); char message[100]; - sprintf(message, (cause_for_stopping == NETWORK_STOP_BY_PLAYER ? - "Network game stopped by player %d!" : - cause_for_stopping == NETWORK_STOP_BY_ERROR ? - "Network game stopped due to internal error!" : - "Network game stopped!"), client_nr); + if (cause_for_stopping == NETWORK_STOP_BY_PLAYER) + sprintf(message, "Network game stopped by player %d!", client_nr); + else + sprintf(message, (cause_for_stopping == NETWORK_STOP_BY_ERROR ? + "Network game stopped due to internal error!" : + "Network game stopped!")); if (cause_for_stopping != NETWORK_STOP_BY_PLAYER || stopped_by_remote_player) @@ -827,6 +821,9 @@ static void Handle_OP_LEVEL_FILE() leveldir_identifier = getStringCopy(getNetworkBufferString(read_buffer)); + if (hasPathSeparator(leveldir_identifier)) + Error(ERR_EXIT, "protocol error: invalid filename from network client"); + InitNetworkLevelDirectory(leveldir_identifier); network_level_dir = getNetworkLevelDir(leveldir_identifier); @@ -837,6 +834,9 @@ static void Handle_OP_LEVEL_FILE() file_info->basename = getStringCopy(getNetworkBufferString(read_buffer)); file_info->filename = getPath2(network_level_dir, file_info->basename); + if (hasPathSeparator(file_info->basename)) + Error(ERR_EXIT, "protocol error: invalid filename from network client"); + getNetworkBufferFile(read_buffer, file_info->filename); use_custom_template = getNetworkBuffer8BitInteger(read_buffer); @@ -847,6 +847,9 @@ static void Handle_OP_LEVEL_FILE() tmpl_info->basename = getStringCopy(getNetworkBufferString(read_buffer)); tmpl_info->filename = getPath2(network_level_dir, tmpl_info->basename); + if (hasPathSeparator(tmpl_info->basename)) + Error(ERR_EXIT, "protocol error: invalid filename from network client"); + getNetworkBufferFile(read_buffer, tmpl_info->filename); }