Skip to content

Commit 039060f

Browse files
committed
Wrote WcEscapeQuote and Use it
1 parent 80815c8 commit 039060f

File tree

3 files changed

+68
-13
lines changed

3 files changed

+68
-13
lines changed

wsl2exe.c

+22-4
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,37 @@ int main()
2727
wchar_t *distName;
2828
distName = WslGetDefaultDistroName();
2929

30-
size_t total = wcslen(modName);
30+
wchar_t **convdWargv;
31+
convdWargv = malloc(sizeof(wchar_t*) * wargc);
32+
33+
wchar_t *modNameEscd;
34+
modNameEscd = WcEscapeQuote(modName);
35+
36+
//prepare convdWargv
37+
size_t modNameEscdSize = wcslen(modNameEscd);
38+
convdWargv[0] = (wchar_t*)malloc(sizeof(wchar_t) * (modNameEscdSize + 1));
39+
wcscpy_s(convdWargv[0], modNameEscdSize + 1, modNameEscd);
40+
3141
for (int i = 1; i < wargc; i++) {
42+
convdWargv[i] = WcEscapeQuote(wargv[i]);
43+
}
44+
45+
46+
//launcher
47+
size_t total = 0;
48+
for (int i = 0; i < wargc; i++) {
3249
total++; //for space
33-
total += wcslen(wargv[i]);
50+
total += wcslen(convdWargv[i]);
3451
}
52+
total--;
3553

3654
size_t totalSize = (sizeof(wchar_t) * (total + 1));
3755
wchar_t *command = (wchar_t*)malloc(totalSize);
38-
wcscpy_s(command, totalSize, modName);
56+
wcscpy_s(command, totalSize, convdWargv[0]);
3957

4058
for (int i = 1; i < wargc; i++) {
4159
wcscat_s(command, totalSize, L" ");
42-
wcscat_s(command, totalSize, wargv[i]);
60+
wcscat_s(command, totalSize, convdWargv[i]);
4361
}
4462

4563
HRESULT hr;

wsl2exe_ap.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,13 @@ int main()
3030
wchar_t **convdWargv;
3131
convdWargv = malloc(sizeof(wchar_t*) * wargc);
3232

33+
wchar_t *modNameEscd;
34+
modNameEscd = WcEscapeQuote(modName);
35+
3336
//prepare convdWargv
34-
size_t modNameSize = wcslen(modName);
35-
convdWargv[0] = (wchar_t*)malloc(sizeof(wchar_t) * (modNameSize + 1));
36-
wcscpy_s(convdWargv[0], modNameSize + 1, modName);
37+
size_t modNameEscdSize = wcslen(modNameEscd);
38+
convdWargv[0] = (wchar_t*)malloc(sizeof(wchar_t) * (modNameEscdSize + 1));
39+
wcscpy_s(convdWargv[0], modNameEscdSize + 1, modNameEscd);
3740

3841
for (int i = 1; i < wargc; i++) {
3942
if(wcsstr(wargv[i], L"\\") != NULL) {
@@ -42,13 +45,10 @@ int main()
4245
fwprintf(stderr, L"ERROR: Path translation failed.\n");
4346
return E_FAIL;
4447
}
45-
size_t bufLen = wcslen(buf);
46-
convdWargv[i] = (wchar_t*)malloc(sizeof(wchar_t) * (bufLen + 1));
47-
wcscpy_s(convdWargv[i], bufLen + 1, buf);
48+
49+
convdWargv[i] = WcEscapeQuote(buf);
4850
} else {
49-
size_t len = wcslen(wargv[i]);
50-
convdWargv[i] = (wchar_t*)malloc(sizeof(wchar_t) * (len + 1));
51-
wcscpy_s(convdWargv[i], len + 1, wargv[i]);
51+
convdWargv[i] = WcEscapeQuote(wargv[i]);
5252
}
5353
}
5454

wsl2exe_common.h

+37
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,43 @@ wchar_t *GetModuleName() {
2424
return modName;
2525
}
2626

27+
wchar_t *WcEscapeQuote(wchar_t *in) {
28+
size_t length = wcslen(in);
29+
if (wcsstr(in, L" ") != NULL) {
30+
length += 2; //add doublequote later
31+
}
32+
33+
//search backslash '\' or '"'
34+
for(int i = 0; in[i] != L'\0'; i++) {
35+
if(in[i] == L'\"' || in[i] == L'\\') {
36+
length++;
37+
}
38+
}
39+
40+
wchar_t* out = (wchar_t*)malloc(sizeof(wchar_t) * (length + 1));
41+
out[length] = L'\0';
42+
43+
int location = 0;
44+
if (wcsstr(in, L" ") != NULL) {
45+
out[0] = L'\"';
46+
out[length - 1] = L'\"';
47+
location++;
48+
length--;
49+
}
50+
51+
for (int i = 0; location < length; i++) {
52+
//append backslash for escaping
53+
if(in[i] == L'\"' || in[i] == L'\\') {
54+
out[location] = L'\\';
55+
location++;
56+
}
57+
out[location] = in[i];
58+
location++;
59+
}
60+
61+
return out;
62+
}
63+
2764
#ifdef __cplusplus
2865
}
2966
#endif

0 commit comments

Comments
 (0)