@@ -34,8 +34,9 @@ int do_linkdir(lua_State* L, const char* src, const char* dst)
3434 GetCurrentDirectoryW (MAX_PATH , cwd );
3535
3636 // Convert the source path to a relative path
37- wchar_t relSrcPath [MAX_PATH ];
38- swprintf (relSrcPath , MAX_PATH , L"%c:%s" , cwd [0 ], wSrcPath );
37+ wchar_t relSrcPath [MAX_PATH + 2 ];
38+ swprintf (relSrcPath , MAX_PATH + 2 , L"%c:%s" , cwd [0 ], wSrcPath );
39+ relSrcPath [MAX_PATH + 1 ] = L'\0' ;
3940
4041 BOOLEAN res = CreateSymbolicLinkW (wDstPath , relSrcPath , SYMBOLIC_LINK_FLAG_DIRECTORY | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE );
4142 return res != 0 ;
@@ -46,8 +47,27 @@ int do_linkdir(lua_State* L, const char* src, const char* dst)
4647 return res != 0 ;
4748 }
4849#else
49- int res = symlink (src , dst );
50- return res == 0 ;
50+ (void )L ;
51+ if (!do_isabsolute (src ))
52+ {
53+ char cwd [PATH_MAX ];
54+ if (!do_getcwd (cwd , PATH_MAX ))
55+ {
56+ return FALSE;
57+ }
58+
59+ char relSrcPath [2 * PATH_MAX + 1 ];
60+ snprintf (relSrcPath , 2 * PATH_MAX + 1 , "%s/%s" , cwd , src );
61+ relSrcPath [2 * PATH_MAX ] = '\0' ;
62+
63+ int res = symlink (relSrcPath , dst );
64+ return res == 0 ;
65+ }
66+ else
67+ {
68+ int res = symlink (src , dst );
69+ return res == 0 ;
70+ }
5171#endif
5272}
5373
0 commit comments