スペースを含むファイル名で texworkswrapper を実行すると texworks.exe は動作を停止しました

スペースを含むファイル名で texworkswrapper を実行すると texworks.exe は動作を停止しました

- 匿 名 の投稿
返信数: 2

W32TeX [2014/01/15] を使用しています.
W32TeX の texworkswrapper でスペースを含むファイル名を指定して
texworks "a b c.pdf" を実行すると 「texworks.exe は動作を停止しました」 と表示されます.
texworks \"a b c.pdf\" とすると回避できます.
texworks "a b c.pdf" の場合は
argv[1] が "a b c.pdf"
となるのに対して
texworks \"a b c.pdf\" の場合は
argv[1] が "a
argv[2] が b
argv[3] が c.pdf"
となりスペースが含まれない引数として処理されたためと思われます.
texworks.c を見ると
スペースが含まれる引数の場合に
malloc で確保した領域の先頭アドレスではなく
main 関数の argv[i] の先頭アドレスに対して
free を使用としているのが原因だと思われます.
malloc ではなく以下のように alloca を使用すれば
free をしなくてもよくなるのではないでしょうか?

$ diff -urN texworks.c texworksfix.c
--- texworks.c  2012-01-06 07:48:57 +0900
+++ texworksfix.c       2014-01-29 03:29:19 +0900
@@ -25,11 +25,13 @@

   for(i = 0; i < argc; i++) {
     if(is_include_space(argv[i])) {
-      p = (char *)malloc(strlen(argv[i])+3);
+#if defined _MSC_VER
+#define alloca _alloca
+#endif
+      p = (char *)alloca(strlen(argv[i])+3);
       strcpy(p, "\"");
       strcat(p, argv[i]);
       strcat(p, "\"");
-      free(argv[i]);
       argv[i] = p;
     }
   }
匿 名 への返信

Re: スペースを含むファイル名で texworkswrapper を実行すると texworks.exe は動作を停止しました

- Akira Kakuto の投稿
> malloc で確保した領域の先頭アドレスではなく
> main 関数の argv[i] の先頭アドレスに対して
> free を使用としているのが原因だと思われます.

ありがとうございます。ときどきやってしまうミスです。
訂正しておきます。
Akira Kakuto への返信

Re: スペースを含むファイル名で texworkswrapper を実行すると texworks.exe は動作を停止しました

- 匿 名 の投稿

W32TeX [2014/01/29] で
web2c-w32.tar.xz と win64/web2c-w64.tar.xz
に含まれている texworkswrapper を使用して
Windows PowerShell, コマンド プロンプト, MSYS2, MSYS1 から
スペースを含むファイル名で texworkswrapper を実行すると
正常に TeXworks が起動することを確認しました.
対応ありがとうございました.