~ubuntu-branches/debian/sid/monopd/sid

« back to all changes in this revision

Viewing changes to src/server.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Schepler
  • Date: 2006-08-12 17:05:23 UTC
  • mfrom: (2.1.1 dapper)
  • Revision ID: james.westby@ubuntu.com-20060812170523-scgnd675p5jpg7lw
Tags: 0.9.3-2
* New patch monopd-0.9.3-dosfix.diff for CVE-2006-1046:
  Fixes a remote DOS vulnerability which could cause the daemon to eat up
  CPU time on the server.  Closes: #355797.
* Bump Standards-Version to 3.7.2 (no changes needed).

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
        m_nextGameId = m_nextPlayerId = 1;
46
46
        m_gatorIdentity = "";
47
47
        m_port = 1234;
48
 
        m_gatorHost = "gator.monopd.net";
 
48
        m_gatorHost = "monopd.unixcode.org";
49
49
        m_gatorPort = 80;
50
50
        m_gatorFrequency = 60;
51
51
        m_useMonopigator = false;
82
82
        for(std::vector<Event *>::iterator it = m_events.begin(); it != m_events.end() && (*it) ; ++it)
83
83
                if (*it == event)
84
84
                {
85
 
                        printf("delEvent %d/%d\n", event->id(), m_events.size());
 
85
                        printf("delEvent %d/%d\n", event->id(), m_events.size()-1);
86
86
                        delete event;
87
87
                        m_events.erase(it);
88
88
                        break;
89
89
                }
90
 
        printf("delEvent -/%d\n", m_events.size());
91
90
}
92
91
 
93
92
Event *MonopdServer::findEvent(Game *game, unsigned int eventType)
100
99
        return 0;
101
100
}
102
101
 
 
102
Event *MonopdServer::findEvent(Game *game, GameObject *object)
 
103
{
 
104
        for(std::vector<Event *>::iterator it = m_events.begin(); it != m_events.end() && (*it) ; ++it)
 
105
                if ( (*it)->game() == game && (*it)->object() == object)
 
106
                        return (*it);
 
107
 
 
108
        return 0;
 
109
}
 
110
 
103
111
void MonopdServer::newGame(Player *player, const std::string gameType)
104
112
{
105
113
        Game *game = new Game(m_nextGameId++);
106
114
        m_games.push_back(game);
107
 
        printf("newGame %d/%d\n", game->id(), m_games.size());
108
115
 
109
116
        game->setProperty("name", (gameType.size() ? gameType : "atlantic"), this);
110
117
 
122
129
        {
123
130
                delGame(game, false);
124
131
                player->ioWrite("<monopd><msg type=\"error\" value=\"Could not load valid configuration for gametype %s.\"/></monopd>\n", gameType.c_str());
 
132
                m_nextGameId--;
125
133
                return;
126
134
        }
127
135
 
 
136
        syslog( LOG_INFO, "new game: id=[%d], type=[%s], games=[%d]", game->id(), gameType.c_str(), m_games.size() );
 
137
 
128
138
        game->addPlayer(player, true);
129
139
 
130
140
        // FIXME: DEPRECATED 1.0
230
240
                        // FIXME: DEPRECATED 1.0
231
241
                        if (verbose)
232
242
                                ioWrite(std::string("<monopd><updategamelist type=\"del\"><game id=\"") + itoa(game->id()) + "\"/></updategamelist></monopd>\n");
233
 
                        printf("delGame %d/%d\n", game->id(), m_games.size());
 
243
                        syslog( LOG_INFO, "del game: id=[%d], games=[%d]", game->id(), m_games.size() - 1 );
234
244
                        m_games.erase(it);
235
 
                        printf("delGame -/%d\n", m_games.size());
236
245
                        break;
237
246
                }
238
247
        delete game;
268
277
        player->sendClientMsg();
269
278
        sendGameList(player, true);
270
279
 
271
 
        printf("new player %d/%d\n", player->id(), m_players.size());
 
280
        syslog( LOG_INFO, "new player: id=[%d], fd=[%d], name=[%s], players=[%d]", player->id(), socket->fd(), name.c_str(), m_players.size() );
272
281
        player = 0;
273
282
        for(std::vector<Player *>::iterator it = m_players.begin(); it != m_players.end() && (player = *it) ; ++it)
274
283
                printf("  player %16s %16s game %d bankrupt %d socket %d fd %d\n", player->name().c_str(), player->getStringProperty("host").c_str(), (player->game() ? player->game()->id() : -1), player->getBoolProperty("bankrupt"), player->socket(), player->socket() ? (int)player->socket()->fd() : -1);
320
329
 
321
330
void MonopdServer::delPlayer(Player *player)
322
331
{
 
332
        // Delete timeout event, if present.
 
333
        Game *game = player ? player->game() : 0;
 
334
        if ( player && game )
 
335
        {
 
336
                Event *event = findEvent( game, dynamic_cast<GameObject *> (player) );
 
337
                if ( event )
 
338
                {
 
339
                        printf("cleared event for player\n");
 
340
                        event->setObject( 0 );
 
341
                }
 
342
                game->removePlayer( player );
 
343
        }
 
344
 
323
345
        ioWrite("<monopd><deleteplayer playerid=\"" + itoa(player->id()) + "\"/></monopd>\n");
324
346
 
325
347
        for(std::vector<Player *>::iterator it = m_players.begin(); it != m_players.end() && (*it) ; ++it)
326
348
                if (*it == player)
327
349
                {
328
350
                        removeFromScope(player);
329
 
                        printf("del player %d/%d\n", player->id(), m_players.size());
 
351
                        syslog( LOG_INFO, "del player: id=[%d], fd=[%d], name=[%s], players=[%d]", player->id(), player->socket() ? player->socket()->fd() : 0, player->getStringProperty("name").c_str(), m_players.size() - 1 );
 
352
                        printf("delPlayer %d/%d\n", player->id(), m_players.size()-1);
330
353
                        delete player;
331
354
                        m_players.erase(it);
332
355
                        player = 0;
333
 
                        printf("del player -/%d\n", m_players.size());
334
356
                        break;
335
357
                }
336
358
 
387
409
{
388
410
        GameConfig *newGameConfig = new GameConfig(id, name, description);
389
411
        m_gameConfigs.push_back(newGameConfig);
390
 
        syslog(LOG_INFO, "loaded game config: %s", name.c_str());
 
412
        syslog( LOG_INFO, "loaded game configuration: game=[%s]", name.c_str() );
391
413
        return newGameConfig;
392
414
}
393
415
 
419
441
                return;
420
442
        }
421
443
 
 
444
        pInput->setSocket( 0 );
 
445
        printf("%s socket 0 spec %d, bank %d, gamerun %d\n", pInput->name().c_str(), pInput->getBoolProperty("spectator"), pInput->getBoolProperty("bankrupt"), game->status() == Game::Run );
422
446
        game->ioInfo("Connection with %s lost.", pInput->name().c_str());
423
447
        
424
448
        // Only remove from game when game not running, or when it's merely a spectator.
429
453
                        exitFromGame = true;
430
454
                else if ( !pInput->getBoolProperty("bankrupt") )
431
455
                {
 
456
                        printf("may reconnect\n");
432
457
                        unsigned int timeout = 180;
433
458
                        game->ioInfo("Player has %ds to reconnect until bankruptcy.", timeout);
434
 
                        pInput->setSocket(0);
435
 
                        Event *event = newEvent(Event::PlayerTimeout);
 
459
                        Event *event = newEvent( Event::PlayerTimeout, game );
436
460
                        event->setLaunchTime(time(0) + timeout);
437
 
                        GameObject *object = pInput;
438
 
                        event->setObject(object);
 
461
                        event->setObject( dynamic_cast<GameObject *> (pInput) );
439
462
                }
440
463
        }
441
464
        else
443
466
        
444
467
        if (exitFromGame)
445
468
        {
 
469
                printf("exit from game %d: %d\n", game->id(), pInput->id());
446
470
                exitGame(game, pInput);
 
471
                printf("delplayer %d\n", pInput->id());
447
472
                delPlayer(pInput);
448
473
        }
449
474
}
464
489
                        {
465
490
                        case Event::TokenMovementTimeout:
466
491
                                if (game)
 
492
                                {
467
493
                                        game->tokenMovementTimeout();
 
494
                                        if ( game->clientsMoving() )
 
495
                                                event->setFrequency( 1 );
 
496
                                        else
 
497
                                                event->setFrequency( 0 );
 
498
                                }
 
499
                                else
 
500
                                        event->setFrequency( 0 );
468
501
                                break;
469
502
                        case Event::SocketTimeout:
470
503
                                returnvalue = event->id();
481
514
                                break;
482
515
                        case Event::PlayerTimeout:
483
516
                                GameObject *object = event->object();
 
517
                                if (!object)
 
518
                                        break;
484
519
 
485
520
                                Player *player;
486
521
                                player = findPlayer(object->id());
499
534
                                        {
500
535
                                                // Game might have ended, silently remove.
501
536
                                                exitGame(game, player);
 
537
                                                // Event might have been deleted now.
 
538
                                                event = 0;
 
539
 
502
540
                                                delPlayer(player);
503
541
                                        }
504
542
                                }
505
 
                                event->setObject(0);
 
543
                                if ( event )
 
544
                                        event->setObject(0);
506
545
                                break;
507
546
                        }
508
547
 
509
 
                        // Delete event from event list
510
 
                        int frequency = event->frequency();
511
 
                        if (frequency)
 
548
                        if ( event )
 
549
                        {
 
550
                                // Delete event from event list
 
551
                                int frequency = event->frequency();
 
552
                                if (frequency)
512
553
                                        event->setLaunchTime(time(0) + frequency);
 
554
                                else
 
555
                                {
 
556
                                        delEvent(event);
 
557
                                        break; // can't use continue, damn vectors
 
558
                                }
 
559
                        }
513
560
                        else
514
 
                        {
515
 
                                delEvent(event);
516
 
                                break; // can't use continue, damn vectors
517
 
                        }
 
561
                                break;
518
562
                } 
519
563
        }
520
564
        sendXMLUpdates();
550
594
        FILE *f = fopen(MONOPD_CONFIGDIR "/monopd.conf", "r");
551
595
        if (!f)
552
596
        {
553
 
                syslog(LOG_ERR, "cannot open config file: %s", MONOPD_CONFIGDIR "/monopd.conf");
 
597
                syslog( LOG_WARNING, "cannot open configuration: file=[%s]", MONOPD_CONFIGDIR "/monopd.conf" );
554
598
                return;
555
599
        }
556
600
 
596
640
        dirp = opendir(MONOPD_DATADIR "/games/");
597
641
        if (!dirp)
598
642
        {
599
 
                syslog(LOG_ERR, "cannot open config dir: %s", MONOPD_DATADIR "/games/");
 
643
                syslog( LOG_ERR, "cannot open game directory, dir=[%s]", MONOPD_DATADIR "/games/" );
600
644
                return;
601
645
        }
602
646
        while ((direntp=readdir(dirp)) != NULL)
607
651
                        f = fopen(filename.c_str(), "r");
608
652
                        if (!f)
609
653
                        {
610
 
                                syslog(LOG_WARNING, "cannot open config file: %s", filename.c_str());
 
654
                                syslog( LOG_WARNING, "cannot open game configuration: file=[%s/%s]", MONOPD_DATADIR "/games", filename.c_str() );
611
655
                                continue;
612
656
                        }
613
657
 
1005
1049
                                        game->declareBankrupt(pInput);
1006
1050
                                        break;
1007
1051
                                case 'p':
1008
 
                                        game->solveDebt(pInput, true);
 
1052
                                        game->solveDebts(pInput, true);
1009
1053
                                        break;
1010
1054
                                default:
1011
1055
                                        pInput->ioNoSuchCmd("there are debts to be settled");