~ubuntu-branches/ubuntu/natty/postgresql-8.4/natty-security

« back to all changes in this revision

Viewing changes to src/bin/pg_ctl/pg_ctl.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2009-07-11 16:59:35 UTC
  • mfrom: (5.1.1 karmic)
  • Revision ID: james.westby@ubuntu.com-20090711165935-jfwin6gfrxf0gfsi
Tags: 8.4.0-2
* debian/libpq-dev.install: Ship catalog/genbki.h. (Closes: #536139)
* debian/rules: Drop --enable-cassert for final release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
 *
5
5
 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
6
6
 *
7
 
 * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.110 2009/04/05 04:19:58 tgl Exp $
 
7
 * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.111 2009/06/11 14:49:07 momjian Exp $
8
8
 *
9
9
 *-------------------------------------------------------------------------
10
10
 */
117
117
static void WINAPI pgwin32_ServiceHandler(DWORD);
118
118
static void WINAPI pgwin32_ServiceMain(DWORD, LPTSTR *);
119
119
static void pgwin32_doRunAsService(void);
120
 
static int      CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service);
 
120
static int      CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service);
121
121
 
122
122
static SERVICE_STATUS status;
123
123
static SERVICE_STATUS_HANDLE hStatus = (SERVICE_STATUS_HANDLE) 0;
412
412
        /*
413
413
         * Look in post_opts for a -p switch.
414
414
         *
415
 
         * This parsing code is not amazingly bright; it could for instance
416
 
         * get fooled if ' -p' occurs within a quoted argument value.  Given
417
 
         * that few people pass complicated settings in post_opts, it's
418
 
         * probably good enough.
 
415
         * This parsing code is not amazingly bright; it could for instance get
 
416
         * fooled if ' -p' occurs within a quoted argument value.  Given that few
 
417
         * people pass complicated settings in post_opts, it's probably good
 
418
         * enough.
419
419
         */
420
420
        for (p = post_opts; *p;)
421
421
        {
447
447
        /*
448
448
         * Search config file for a 'port' option.
449
449
         *
450
 
         * This parsing code isn't amazingly bright either, but it should be
451
 
         * okay for valid port settings.
 
450
         * This parsing code isn't amazingly bright either, but it should be okay
 
451
         * for valid port settings.
452
452
         */
453
453
        if (!*portstr)
454
454
        {
528
528
                                 */
529
529
                                status.dwWaitHint += 6000;
530
530
                                status.dwCheckPoint++;
531
 
                                SetServiceStatus(hStatus, (LPSERVICE_STATUS) & status);
 
531
                                SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
532
532
                        }
533
533
 
534
534
                        else
569
569
{
570
570
        if (post_opts == NULL)
571
571
        {
572
 
                post_opts = "";         /* default */
 
572
                post_opts = "";                 /* default */
573
573
                if (ctl_command == RESTART_COMMAND)
574
574
                {
575
575
                        char      **optlines;
603
603
                                 */
604
604
                                if ((arg1 = strstr(optline, " \"")) != NULL)
605
605
                                {
606
 
                                        *arg1 = '\0';   /* terminate so we get only program name */
607
 
                                        post_opts = arg1 + 1; /* point past whitespace */
 
606
                                        *arg1 = '\0';           /* terminate so we get only program
 
607
                                                                                 * name */
 
608
                                        post_opts = arg1 + 1;           /* point past whitespace */
608
609
                                }
609
610
                                if (postgres_path == NULL)
610
611
                                        postgres_path = optline;
717
718
{
718
719
        int                     cnt;
719
720
        pgpid_t         pid;
720
 
        struct stat     statbuf;
 
721
        struct stat statbuf;
721
722
 
722
723
        pid = get_pgpid();
723
724
 
792
793
{
793
794
        int                     cnt;
794
795
        pgpid_t         pid;
795
 
        struct stat     statbuf;
 
796
        struct stat statbuf;
796
797
 
797
798
        pid = get_pgpid();
798
799
 
1142
1143
pgwin32_SetServiceStatus(DWORD currentState)
1143
1144
{
1144
1145
        status.dwCurrentState = currentState;
1145
 
        SetServiceStatus(hStatus, (LPSERVICE_STATUS) & status);
 
1146
        SetServiceStatus(hStatus, (LPSERVICE_STATUS) &status);
1146
1147
}
1147
1148
 
1148
1149
static void WINAPI
1178
1179
}
1179
1180
 
1180
1181
static void WINAPI
1181
 
pgwin32_ServiceMain(DWORD argc, LPTSTR * argv)
 
1182
pgwin32_ServiceMain(DWORD argc, LPTSTR *argv)
1182
1183
{
1183
1184
        PROCESS_INFORMATION pi;
1184
1185
        DWORD           ret;
1286
1287
 * also load the couple of functions that *do* exist in minwg headers but not
1287
1288
 * on NT4. That way, we don't break on NT4.
1288
1289
 */
1289
 
typedef         BOOL(WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
1290
 
typedef         BOOL(WINAPI * __IsProcessInJob) (HANDLE, HANDLE, PBOOL);
1291
 
typedef         HANDLE(WINAPI * __CreateJobObject) (LPSECURITY_ATTRIBUTES, LPCTSTR);
1292
 
typedef         BOOL(WINAPI * __SetInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
1293
 
typedef         BOOL(WINAPI * __AssignProcessToJobObject) (HANDLE, HANDLE);
1294
 
typedef         BOOL(WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
 
1290
typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);
 
1291
typedef BOOL (WINAPI * __IsProcessInJob) (HANDLE, HANDLE, PBOOL);
 
1292
typedef HANDLE (WINAPI * __CreateJobObject) (LPSECURITY_ATTRIBUTES, LPCTSTR);
 
1293
typedef BOOL (WINAPI * __SetInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD);
 
1294
typedef BOOL (WINAPI * __AssignProcessToJobObject) (HANDLE, HANDLE);
 
1295
typedef BOOL (WINAPI * __QueryInformationJobObject) (HANDLE, JOBOBJECTINFOCLASS, LPVOID, DWORD, LPDWORD);
1295
1296
 
1296
1297
/* Windows API define missing from MingW headers */
1297
1298
#define DISABLE_MAX_PRIVILEGE   0x1
1309
1310
 * automatically destroyed when pg_ctl exits.
1310
1311
 */
1311
1312
static int
1312
 
CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION * processInfo, bool as_service)
 
1313
CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_service)
1313
1314
{
1314
1315
        int                     r;
1315
1316
        BOOL            b;
1464
1465
                                                osv.dwOSVersionInfoSize = sizeof(osv);
1465
1466
                                                if (!GetVersionEx(&osv) ||
1466
1467
                                                        osv.dwMajorVersion < 6 ||
1467
 
                                                        (osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
 
1468
                                                (osv.dwMajorVersion == 6 && osv.dwMinorVersion == 0))
1468
1469
                                                {
1469
1470
                                                        /*
1470
 
                                                         * On Windows 7 (and presumably later), JOB_OBJECT_UILIMIT_HANDLES prevents us from
1471
 
                                                         * starting as a service. So we only enable it on Vista and earlier (version <= 6.0)
 
1471
                                                         * On Windows 7 (and presumably later),
 
1472
                                                         * JOB_OBJECT_UILIMIT_HANDLES prevents us from
 
1473
                                                         * starting as a service. So we only enable it on
 
1474
                                                         * Vista and earlier (version <= 6.0)
1472
1475
                                                         */
1473
1476
                                                        uiRestrictions.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
1474
1477
                                                }
1486
1489
        }
1487
1490
 
1488
1491
#ifndef __CYGWIN__
1489
 
    AddUserToDacl(processInfo->hProcess);
 
1492
        AddUserToDacl(processInfo->hProcess);
1490
1493
#endif
1491
 
    
 
1494
 
1492
1495
        CloseHandle(restrictedToken);
1493
1496
 
1494
1497
        ResumeThread(processInfo->hThread);
1520
1523
        printf(_("  %s start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n"), progname);
1521
1524
        printf(_("  %s stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"), progname);
1522
1525
        printf(_("  %s restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]\n"
1523
 
                 "                 [-o \"OPTIONS\"]\n"), progname);
 
1526
                         "                 [-o \"OPTIONS\"]\n"), progname);
1524
1527
        printf(_("  %s reload  [-D DATADIR] [-s]\n"), progname);
1525
1528
        printf(_("  %s status  [-D DATADIR]\n"), progname);
1526
1529
        printf(_("  %s kill    SIGNALNAME PID\n"), progname);