mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
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>
42 lines
825 B
C
42 lines
825 B
C
#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;
|
|
}
|
|
|