Commit 09f0d64d authored by Greg Stein's avatar Greg Stein
Browse files

Use "const char * const *" for process->argv (which is the correct

const-ness since we sometimes put "some string" in there, and also the CRT's
argv). propagate this change within http_main and mpm/winnt/ (also correct
some other const type usage within the MPM).

fix ab's call to parse_url() which removed a const to actually manipulate an
arg from the CRT's argv (indirectly via opt->arg). no idea how this has
avoided segfaulting.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87130 13f79535-47bb-0310-9956-ffa450edef68
parent 8a45f5f0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -597,7 +597,7 @@ struct process_rec {
    /** How many command line arguments were pass to the program */
    int argc;
    /** The command line arguments */
    char *const *argv;
    const char * const *argv;
    /** The program name used to execute the program */
    const char *short_name;
};
+16 −18
Original line number Diff line number Diff line
@@ -203,11 +203,9 @@ static void destroy_and_exit_process(process_rec *process, int process_exit_valu
    exit(process_exit_value);
}

static process_rec *create_process(int argc, char *const *argv)
static process_rec *create_process(int argc, const char * const *argv)
{
    process_rec *process;
    
    {
    apr_pool_t *cntx;
    apr_status_t stat;

@@ -222,7 +220,7 @@ static process_rec *create_process(int argc, char *const *argv)

    process = apr_palloc(cntx, sizeof(process_rec));
    process->pool = cntx;
    }

    apr_create_pool(&process->pconf, process->pool);
    process->argc = argc;
    process->argv = argv;
@@ -281,7 +279,7 @@ static void usage(process_rec *process)
    destroy_and_exit_process(process, 1);
}

int main(int argc, char *argv[])
int main(int argc, const char * const argv[])
{
    char c;
    int configtestonly = 0;
+16 −17
Original line number Diff line number Diff line
@@ -1789,7 +1789,7 @@ die_now:
}


#define SERVICE_UNNAMED -1
#define SERVICE_UNNAMED (-1)

/* service_nt_main_fn needs to append the StartService() args 
 * outside of our call stack and thread as the service starts...
@@ -1803,7 +1803,7 @@ apr_array_header_t *mpm_new_argv;

static apr_status_t service_to_start_success;
static int inst_argc;
static char **inst_argv;
static const char * const *inst_argv;
    
void winnt_rewrite_args(process_rec *process) 
{
@@ -1887,18 +1887,16 @@ void winnt_rewrite_args(process_rec *process)
     * initial pre-flight of the config parser.
     */

    mpm_new_argv = apr_make_array(process->pool, process->argc + 2, sizeof(char *));
    new_arg = (char**) apr_push_array(mpm_new_argv);
    *new_arg = (char *) process->argv[0];
    
    new_arg = (char**) apr_push_array(mpm_new_argv);
    *new_arg = "-d";
    new_arg = (char**) apr_push_array(mpm_new_argv);
    *new_arg = def_server_root;
    mpm_new_argv = apr_make_array(process->pool, process->argc + 2,
                                  sizeof(const char *));
    *(const char **)apr_push_array(mpm_new_argv) = process->argv[0];
    *(const char **)apr_push_array(mpm_new_argv) = "-d";
    *(const char **)apr_push_array(mpm_new_argv) = def_server_root;

    fixed_args = mpm_new_argv->nelts;

    optbuf[0] = '-'; optbuf[2] = '\0';
    optbuf[0] = '-';
    optbuf[2] = '\0';
    apr_initopt(&opt, process->pool, process->argc, (char**) process->argv);
    while (apr_getopt(opt, "n:k:iu" AP_SERVER_BASEARGS, 
                      optbuf + 1, &optarg) == APR_SUCCESS) {
@@ -1920,11 +1918,11 @@ void winnt_rewrite_args(process_rec *process)
            signal_arg = "uninstall";
            break;
        default:
            new_arg = (char**) apr_push_array(mpm_new_argv);
            *new_arg = apr_pstrdup(process->pool, optbuf);
            *(const char **)apr_push_array(mpm_new_argv) =
                apr_pstrdup(process->pool, optbuf);

            if (optarg) {
                new_arg = (char**) apr_push_array(mpm_new_argv);
                *new_arg = optarg;
                *(const char **)apr_push_array(mpm_new_argv) = optarg;
            }
            break;
        }
@@ -2005,10 +2003,11 @@ void winnt_rewrite_args(process_rec *process)
     * These will be used for the -k install parameters, as well as
     * for the -k start service override arguments.
     */
    inst_argv = (char**) mpm_new_argv->elts + mpm_new_argv->nelts - inst_argc;
    inst_argv = (const char * const *)mpm_new_argv->elts
        + mpm_new_argv->nelts - inst_argc;

    process->argc = mpm_new_argv->nelts; 
    process->argv = (char**) mpm_new_argv->elts;
    process->argv = (const char * const *) mpm_new_argv->elts;
}


+3 −1
Original line number Diff line number Diff line
@@ -358,7 +358,9 @@ apr_status_t ap_registry_store_value(const char *key, const char *name, const ch
    return_error(rv);
}

apr_status_t ap_registry_store_array(apr_pool_t *p, const char *key, const char *name, int nelts, char const* const* elts)
apr_status_t ap_registry_store_array(apr_pool_t *p,
                                     const char *key, const char *name,
                                     int nelts, const char * const * elts)
{
    int  bufsize, i;
    char *buf, *tmp;
+32 −27
Original line number Diff line number Diff line
@@ -88,9 +88,10 @@
#include "mpm_winnt.h"
#include "apr_strings.h"

char const* service_name = NULL;
char const* display_name = NULL;
char const* signal_arg = NULL;
static const char * service_name = NULL;

/* ### should be namespace-protected */
const char * display_name = NULL;

static struct
{
@@ -594,9 +595,11 @@ static void __stdcall service_nt_main_fn(DWORD argc, LPTSTR *argv)
     */
    if (argc > 1) 
    {
        char **cmb_data;
        const char **cmb_data;

        mpm_new_argv->nalloc = mpm_new_argv->nelts + argc - 1;
        cmb_data = apr_palloc(mpm_new_argv->cont,
                             (mpm_new_argv->nelts + argc - 1) * sizeof(char *));
                              mpm_new_argv->nalloc * sizeof(const char *));

        /* mpm_new_argv remains first (of lower significance) */
        memcpy (cmb_data, mpm_new_argv->elts, 
@@ -608,7 +611,7 @@ static void __stdcall service_nt_main_fn(DWORD argc, LPTSTR *argv)
        
        /* The replacement arg list is complete */
        mpm_new_argv->elts = (char *)cmb_data;
        mpm_new_argv->nalloc = mpm_new_argv->nelts += argc - 1;
        mpm_new_argv->nelts = mpm_new_argv->nalloc;
    }
        
    /* Let the main thread continue now... but hang on to the
@@ -670,7 +673,7 @@ apr_status_t mpm_merge_service_args(apr_pool_t *p,
{
    apr_array_header_t *svc_args = NULL;
    char conf_key[MAX_PATH];
    char **cmb_data;
    const char **cmb_data;
    apr_status_t rv;

    apr_snprintf(conf_key, sizeof(conf_key), SERVICEPARAMS, service_name);
@@ -696,7 +699,8 @@ apr_status_t mpm_merge_service_args(apr_pool_t *p,
     * time to _prepend_ the default arguments for the server from 
     * the service's default arguments (all others override them)...
     */
    cmb_data = apr_palloc(p, (args->nelts + svc_args->nelts) * sizeof(char *));
    args->nalloc = args->nelts + svc_args->nelts;
    cmb_data = apr_palloc(p, args->nalloc * sizeof(const char *));

    /* First three args (argv[0], -f, path) remain first */
    memcpy(cmb_data, args->elts, args->elt_size * fixed_args);
@@ -707,11 +711,11 @@ apr_status_t mpm_merge_service_args(apr_pool_t *p,
    
    /* Remaining new args follow  */
    memcpy(cmb_data + fixed_args + svc_args->nelts,
            (char**) args->elts + fixed_args, 
           (const char **)args->elts + fixed_args, 
           args->elt_size * (args->nelts - fixed_args));
    
    args->elts = (char *)cmb_data;
    args->nalloc = (args->nelts += svc_args->nelts);
    args->nelts = args->nalloc;

    return APR_SUCCESS;
}
@@ -814,7 +818,7 @@ void mpm_service_stopping(void)


apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc, 
                                char const* const* argv)
                                 const char * const * argv)
{
    char key_name[MAX_PATH];
    char exe_path[MAX_PATH];
@@ -1020,7 +1024,7 @@ static int signal_service_transition(SC_HANDLE schService, DWORD signal, DWORD p


apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc, 
                              char const* const* argv)
                               const char * const * argv)
{
    apr_status_t rv;
    
@@ -1028,7 +1032,7 @@ apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc,

    if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        char **start_argv;
        const char **start_argv;
        SC_HANDLE   schService;
        SC_HANDLE   schSCManager;

@@ -1062,10 +1066,10 @@ apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc,
        }
        
        argc += 1;
        start_argv = apr_palloc(ptemp, argc * sizeof(char**));
        start_argv[0] = (char*) service_name;
        start_argv = apr_palloc(ptemp, argc * sizeof(const char **));
        start_argv[0] = service_name;
        if (argc > 1)
            memcpy(start_argv + 1, argv, (argc - 1) * sizeof(char**));
            memcpy(start_argv + 1, argv, (argc - 1) * sizeof(const char **));
        
        rv = APR_EINIT;
        if (StartService(schService, argc, start_argv)
@@ -1115,7 +1119,8 @@ apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc,
        pCommand = apr_psprintf(ptemp, "\"%s\" -n %s -k runservice", 
                               exe_path, service_name);  
        for (i = 0; i < argc; ++i) {
            pCommand = apr_pstrcat(ptemp, pCommand, " \"", argv[i], "\"", NULL);
            pCommand = apr_pstrcat(ptemp, pCommand,
                                   " \"", argv[i], "\"", NULL);
        }
        
        memset(&si, 0, sizeof(si));
Loading