* win32/win32.c (argv_size): merged into join_argv() to maintain the
agreement with it. removed code has a calclulation bug. fixed [Bug#2388] * win32/win32.c (join_argv): calc and return the length of joined argv. the cause of the original bug was clarified by Masaya TARUI <tarui AT prx.jp> and the solution was suggested by him, too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27862 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f8d97b0026
commit
d165fa2504
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
Mon May 17 21:08:53 2010 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
|
* win32/win32.c (argv_size): merged into join_argv() to maintain the
|
||||||
|
agreement with it. removed code has a calclulation bug.
|
||||||
|
fixed [Bug#2388]
|
||||||
|
|
||||||
|
* win32/win32.c (join_argv): calc and return the length of joined
|
||||||
|
argv.
|
||||||
|
the cause of the original bug was clarified by Masaya TARUI
|
||||||
|
<tarui AT prx.jp> and the solution was suggested by him, too.
|
||||||
|
|
||||||
Mon Apr 5 09:20:08 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
Mon Apr 5 09:20:08 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* enc/iso_2022_jp.h: add CP50220.
|
* enc/iso_2022_jp.h: add CP50220.
|
||||||
|
@ -875,53 +875,19 @@ rb_w32_get_osfhandle(int fh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
argv_size(char *const *argv, BOOL escape)
|
|
||||||
{
|
|
||||||
const char *p;
|
|
||||||
char *const *t;
|
|
||||||
int len, n, bs, quote;
|
|
||||||
|
|
||||||
for (t = argv, len = 0; *t; t++) {
|
|
||||||
for (p = *t, n = quote = bs = 0; *p; ++p) {
|
|
||||||
switch (*p) {
|
|
||||||
case '\\':
|
|
||||||
++bs;
|
|
||||||
break;
|
|
||||||
case '<': case '>': case '|': case '^':
|
|
||||||
bs = 0;
|
|
||||||
if (escape && !quote) n++;
|
|
||||||
break;
|
|
||||||
case '"':
|
|
||||||
n += bs + 1; bs = 0;
|
|
||||||
quote = 1;
|
|
||||||
break;
|
|
||||||
case ' ': case '\t':
|
|
||||||
quote = 1;
|
|
||||||
default:
|
|
||||||
bs = 0;
|
|
||||||
p = CharNext(p) - 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
len += p - *t + n + 1;
|
|
||||||
if (p - *t == 0 || quote) len += 2;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
join_argv(char *cmd, char *const *argv, BOOL escape)
|
join_argv(char *cmd, char *const *argv, BOOL escape)
|
||||||
{
|
{
|
||||||
const char *p, *s;
|
const char *p, *s;
|
||||||
char *q, *const *t;
|
char *q, *const *t;
|
||||||
int n, bs, quote;
|
int len, n, bs, quote;
|
||||||
|
|
||||||
for (t = argv, q = cmd; p = *t; t++) {
|
for (t = argv, q = cmd, len = 0; p = *t; t++) {
|
||||||
quote = 0;
|
quote = 0;
|
||||||
s = p;
|
s = p;
|
||||||
if (!*p || strpbrk(p, " \t\"'")) {
|
if (!*p || strpbrk(p, " \t\"'")) {
|
||||||
quote = 1;
|
quote = 1;
|
||||||
*q++ = '"';
|
len++;
|
||||||
|
if (q) *q++ = '"';
|
||||||
}
|
}
|
||||||
for (bs = 0; *p; ++p) {
|
for (bs = 0; *p; ++p) {
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
@ -929,13 +895,28 @@ join_argv(char *cmd, char *const *argv, BOOL escape)
|
|||||||
++bs;
|
++bs;
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
memcpy(q, s, n = p - s); q += n; s = p;
|
len += n = p - s;
|
||||||
memset(q, '\\', ++bs); q += bs; bs = 0;
|
if (q) {
|
||||||
|
memcpy(q, s, n);
|
||||||
|
q += n;
|
||||||
|
}
|
||||||
|
s = p;
|
||||||
|
len += ++bs;
|
||||||
|
if (q) {
|
||||||
|
memset(q, '\\', bs);
|
||||||
|
q += bs;
|
||||||
|
}
|
||||||
|
bs = 0;
|
||||||
break;
|
break;
|
||||||
case '<': case '>': case '|': case '^':
|
case '<': case '>': case '|': case '^':
|
||||||
if (escape && !quote) {
|
if (escape && !quote) {
|
||||||
memcpy(q, s, n = p - s); q += n; s = p;
|
len += (n = p - s) + 1;
|
||||||
*q++ = '^';
|
if (q) {
|
||||||
|
memcpy(q, s, n);
|
||||||
|
q += n;
|
||||||
|
*q++ = '^';
|
||||||
|
}
|
||||||
|
s = p;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -944,14 +925,21 @@ join_argv(char *cmd, char *const *argv, BOOL escape)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memcpy(q, s, n = p - s);
|
len += (n = p - s) + 1;
|
||||||
q += n;
|
if (quote) len++;
|
||||||
if (quote) *q++ = '"';
|
if (q) {
|
||||||
*q++ = ' ';
|
memcpy(q, s, n);
|
||||||
|
q += n;
|
||||||
|
if (quote) *q++ = '"';
|
||||||
|
*q++ = ' ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (q > cmd) --q;
|
if (q > cmd) --len;
|
||||||
*q = '\0';
|
if (q) {
|
||||||
return cmd;
|
if (q > cmd) --q;
|
||||||
|
*q = '\0';
|
||||||
|
}
|
||||||
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_SYS_PARAM_H
|
#ifdef HAVE_SYS_PARAM_H
|
||||||
@ -1215,10 +1203,10 @@ rb_w32_aspawn(int mode, const char *prog, char *const *argv)
|
|||||||
char *progs[2];
|
char *progs[2];
|
||||||
progs[0] = (char *)prog;
|
progs[0] = (char *)prog;
|
||||||
progs[1] = NULL;
|
progs[1] = NULL;
|
||||||
len = argv_size(progs, ntcmd);
|
len = join_argv(NULL, progs, ntcmd);
|
||||||
if (c_switch) len += 3;
|
if (c_switch) len += 3;
|
||||||
else ++argv;
|
else ++argv;
|
||||||
if (argv[0]) len += argv_size(argv, ntcmd);
|
if (argv[0]) len += join_argv(NULL, argv, ntcmd);
|
||||||
cmd = ALLOCA_N(char, len);
|
cmd = ALLOCA_N(char, len);
|
||||||
join_argv(cmd, progs, ntcmd);
|
join_argv(cmd, progs, ntcmd);
|
||||||
if (c_switch) strlcat(cmd, " /c", len);
|
if (c_switch) strlcat(cmd, " /c", len);
|
||||||
@ -1226,7 +1214,7 @@ rb_w32_aspawn(int mode, const char *prog, char *const *argv)
|
|||||||
prog = c_switch ? shell : 0;
|
prog = c_switch ? shell : 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
len = argv_size(argv, FALSE);
|
len = join_argv(NULL, argv, FALSE);
|
||||||
cmd = ALLOCA_N(char, len);
|
cmd = ALLOCA_N(char, len);
|
||||||
join_argv(cmd, argv, FALSE);
|
join_argv(cmd, argv, FALSE);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user