Ticket #34: 0002-tprbuilder-under-nix-escape-shell-metacharacters.patch

File 0002-tprbuilder-under-nix-escape-shell-metacharacters.patch, 2.4 KB (added by debrouxl, 3 years ago)

Patch to escape shell metacharacters when launching external programs

  • trunk/tigcc/tprbuilder/src/tprbuilder.c

    From d10b5ecfc4b3a37e67c2ee43450adf944a8c4941 Mon Sep 17 00:00:00 2001
    From: Lionel Debroux <lionel_debroux@yahoo.fr>
    Date: Sun, 28 Dec 2008 18:04:04 +0100
    Subject: tprbuilder: under *nix, escape shell metacharacters in command lines.
     This way, a data variable named "a\a" in the TPR works properly (previously, "a\\a" had to be used instead).
    
    ---
     trunk/tigcc/tprbuilder/src/tprbuilder.c |   54 +++++++++++++++++++++++++++++++
     1 files changed, 54 insertions(+), 0 deletions(-)
    
    diff --git a/trunk/tigcc/tprbuilder/src/tprbuilder.c b/trunk/tigcc/tprbuilder/src/tprbuilder.c
    index 5de76fe..81cb8d3 100644
    a b int delete(char *filename) 
    371371    return 0; 
    372372} 
    373373 
     374#ifndef __WIN32__ 
     375/* 
     376   Escape command line. 
     377*/ 
     378static inline void escape_arg(char *escaped_arg, const char *unescaped_arg) 
     379{ 
     380    char *p; 
     381    strcpy(escaped_arg,unescaped_arg); 
     382    for (p=escaped_arg; *p; p++) { 
     383        switch (*p) { 
     384            /* The following characters are shell characters and need to be escaped! */ 
     385            case '\\': 
     386            case '\"': 
     387            case '\'': 
     388            case '$': 
     389            case '!': 
     390            case '^': 
     391            case '&': 
     392            case '*': 
     393            case '(': 
     394            case ')': 
     395            case '~': 
     396            case '[': 
     397            case ']': 
     398            case '|': 
     399            case '{': 
     400            case '}': 
     401            case ';': 
     402            case '<': 
     403            case '>': 
     404            case '?': 
     405                memmove(p+1,p,strlen(p)+1); 
     406                *(p++)='\\'; 
     407            default: 
     408                break; 
     409        } 
     410    } 
     411} 
     412#endif 
     413 
    374414/* 
    375415   Execute a program by calling the shell 
    376416*/ 
    int execute(char *cmdline) 
    380420        fprintf(stderr, "tprbuilder: %s\n", cmdline); 
    381421    } 
    382422 
     423#ifndef __WIN32__ 
     424    /* Under *nix, we need to escape shell metacharacters. */ 
     425    char escapedcmdline[((strlen(cmdline))<<1)+1]; 
     426    escape_arg(escapedcmdline,cmdline); 
     427    if (!quiet) { 
     428        fprintf(stderr, "tprbuilder: %s\n", escapedcmdline); 
     429    } 
     430 
     431    if(system(escapedcmdline) != 0) { 
     432        exit(0); 
     433    } 
     434#else 
    383435    if(system(cmdline) != 0) { 
    384436        exit(0); 
    385437    } 
     438#endif 
    386439 
    387440    return 0; 
    388441} 
    char* strip(char *str) 
    426479    return str; 
    427480} 
    428481 
     482 
    429483/* 
    430484   Print an error msg 
    431485*/