Browse Source
A useful shell safety helper sq_expand() was hidden as a static function in diff.c. Extract it out and make it available as sq_quote(). Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>maint


4 changed files with 76 additions and 41 deletions
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
#include "cache.h" |
||||
#include "quote.h" |
||||
|
||||
/* Help to copy the thing properly quoted for the shell safety. |
||||
* any single quote is replaced with '\'', and the caller is |
||||
* expected to enclose the result within a single quote pair. |
||||
* |
||||
* E.g. |
||||
* original sq_quote result |
||||
* name ==> name ==> 'name' |
||||
* a b ==> a b ==> 'a b' |
||||
* a'b ==> a'\''b ==> 'a'\''b' |
||||
*/ |
||||
char *sq_quote(const char *src) |
||||
{ |
||||
static char *buf = NULL; |
||||
int cnt, c; |
||||
const char *cp; |
||||
char *bp; |
||||
|
||||
/* count bytes needed to store the quoted string. */ |
||||
for (cnt = 3, cp = src; *cp; cnt++, cp++) |
||||
if (*cp == '\'') |
||||
cnt += 3; |
||||
|
||||
buf = xmalloc(cnt); |
||||
bp = buf; |
||||
*bp++ = '\''; |
||||
while ((c = *src++)) { |
||||
if (c != '\'') |
||||
*bp++ = c; |
||||
else { |
||||
bp = strcpy(bp, "'\\''"); |
||||
bp += 4; |
||||
} |
||||
} |
||||
*bp++ = '\''; |
||||
*bp = 0; |
||||
return buf; |
||||
} |
||||
|
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
#ifndef QUOTE_H |
||||
#define QUOTE_H |
||||
|
||||
|
||||
/* Help to copy the thing properly quoted for the shell safety. |
||||
* any single quote is replaced with '\'', and the whole thing |
||||
* is enclosed in a single quote pair. |
||||
* |
||||
* For example, if you are passing the result to system() as an |
||||
* argument: |
||||
* |
||||
* sprintf(cmd, "foobar %s %s", sq_quote(arg0), sq_quote(arg1)) |
||||
* |
||||
* would be appropriate. If the system() is going to call ssh to |
||||
* run the command on the other side: |
||||
* |
||||
* sprintf(cmd, "git-diff-tree %s %s", sq_quote(arg0), sq_quote(arg1)); |
||||
* sprintf(rcmd, "ssh %s %s", sq_quote(host), sq_quote(cmd)); |
||||
* |
||||
* Note that the above examples leak memory! Remember to free result from |
||||
* sq_quote() in a real application. |
||||
*/ |
||||
|
||||
char *sq_quote(const char *src); |
||||
|
||||
#endif |
Loading…
Reference in new issue