Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2011-08-02 04:06:03 +0400
committerRyan Dahl <ry@tinyclouds.org>2011-08-02 04:06:03 +0400
commitbceab40b02f2da2ad282a0f649acf5ea251d2490 (patch)
tree488eab79b050397e8cc2931ed2ff3f6a4688a4b1 /deps
parente1bb241b51102a4212f71bc525b1c6687326d180 (diff)
Upgrade libuv to c35548a
Diffstat (limited to 'deps')
-rw-r--r--deps/uv/src/win/process.c75
-rw-r--r--deps/uv/test/test-spawn.c3
2 files changed, 67 insertions, 11 deletions
diff --git a/deps/uv/src/win/process.c b/deps/uv/src/win/process.c
index e259677af9b..6ad221f7e7c 100644
--- a/deps/uv/src/win/process.c
+++ b/deps/uv/src/win/process.c
@@ -76,6 +76,48 @@ static void uv_process_init(uv_process_t* handle) {
/*
+ * Quotes command line arguments
+ * Returns a pointer to the end (next char to be written) of the buffer
+ */
+static wchar_t* quote_cmd_arg(wchar_t *source, wchar_t *target,
+ wchar_t terminator) {
+ int len = wcslen(source),
+ i;
+
+ // Check if the string must be quoted;
+ // if unnecessary, don't do it, it may only confuse older programs.
+ if (len == 0) {
+ goto quote;
+ }
+ for (i = 0; i < len; i++) {
+ if (source[i] == L' ' || source[i] == L'"') {
+ goto quote;
+ }
+ }
+
+ // No quotation needed
+ wcsncpy(target, source, len);
+ target += len;
+ *(target++) = terminator;
+ return target;
+
+quote:
+ // Quote
+ *(target++) = L'"';
+ for (i = 0; i < len; i++) {
+ if (source[i] == L'"' || source[i] == L'\\') {
+ *(target++) = '\\';
+ }
+ *(target++) = source[i];
+ }
+ *(target++) = L'"';
+ *(target++) = terminator;
+
+ return target;
+}
+
+
+/*
* Path search functions
*/
@@ -369,13 +411,21 @@ static wchar_t* make_program_args(char** args) {
size_t size = 0;
size_t len;
int arg_count = 0;
+ wchar_t* buffer;
+ int arg_size;
+ int buffer_size = 0;
/* Count the required size. */
for (arg = args; *arg; arg++) {
- size += (uv_utf8_to_utf16(*arg, NULL, 0) * sizeof(wchar_t));
+ arg_size = uv_utf8_to_utf16(*arg, NULL, 0) * sizeof(wchar_t);
+ size += arg_size;
+ buffer_size = arg_size > buffer_size ? arg_size : buffer_size;
arg_count++;
}
+ /* Adjust for potential quotes. */
+ size += arg_count * 2;
+
/* Arguments are separated with a space. */
if (arg_count > 0) {
size += arg_count - 1;
@@ -386,21 +436,28 @@ static wchar_t* make_program_args(char** args) {
uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
}
+ buffer = (wchar_t*)malloc(buffer_size);
+ if (!buffer) {
+ uv_fatal_error(ERROR_OUTOFMEMORY, "malloc");
+ }
+
ptr = dst;
- for (arg = args; *arg; arg++, ptr += len) {
- len = uv_utf8_to_utf16(*arg, ptr, (size_t)(size - (ptr - dst)));
+ for (arg = args; *arg; arg++) {
+ len = uv_utf8_to_utf16(*arg, buffer, (size_t)(size - (ptr - dst)));
if (!len) {
- free(dst);
- return NULL;
+ goto error;
}
- if (*(arg + 1)) {
- /* Replace with a space if there are more args. */
- *((ptr + len) - 1) = L' ';
- }
+ ptr = quote_cmd_arg(buffer, ptr, *(arg + 1) ? L' ' : L'\0');
}
+ free(buffer);
return dst;
+
+error:
+ free(dst);
+ free(buffer);
+ return NULL;
}
/*
diff --git a/deps/uv/test/test-spawn.c b/deps/uv/test/test-spawn.c
index fc1c1aedfb1..2ab6e6ca6a1 100644
--- a/deps/uv/test/test-spawn.c
+++ b/deps/uv/test/test-spawn.c
@@ -58,11 +58,10 @@ static void kill_cb(uv_process_t* process, int exit_status, int term_signal) {
exit_cb_called++;
#ifdef _WIN32
ASSERT(exit_status == 1);
- ASSERT(term_signal == 0);
#else
ASSERT(exit_status == 0);
- ASSERT(term_signal == 15);
#endif
+ ASSERT(term_signal == 15);
uv_close((uv_handle_t*)process, close_cb);
}