Mail Archives: djgpp-workers/1996/08/12/01:04:45
On Sun, 11 Aug 1996, =?ISO-2022-JP?B?GyRCQEQ7M0JnMnAbKEI=?= /Daisuke Aoyama wrote:
> `xstat.h' says MAX_TRUE_NAME is 128 but `limits.h' says PATH_MAX is 512.
> > strcpy(pathname, path)
> > p = pathname + strlen(pathname) - 1;
>
> It is rarely `path' is copied over array (and crash)
> I suggest it check `path' length before copying.
These are bugs. Thanks for pointing them out. Patches below.
> If coff file executed by `go32-v2' then all of exception handlers were broken
> (by `go32-v2' ?). Is it only problem under Win95 ?
``Broken''--how? What exactly goes wrong with with the exception
handlers?
----------------------------- cut here -------------------------------
*** posix/sys/stat/xstat.h~0 Sun Nov 12 21:51:24 1995
--- posix/sys/stat/xstat.h Sun Aug 11 17:47:46 1996
***************
*** 32,40 ****
#define MK_FOFF(s,o) ((int)((((unsigned long)(s)) << 4) + (unsigned short)(o)))
#endif
! /* Ralph Brown's Interrupt List says this should be the length
! of the buffer for INT 21H AX=6000H. */
! #define MAX_TRUE_NAME 128
extern unsigned short _osmajor, _osminor;
extern const char * _os_flavor;
--- 32,38 ----
#define MK_FOFF(s,o) ((int)((((unsigned long)(s)) << 4) + (unsigned short)(o)))
#endif
! #define MAX_TRUE_NAME FILENAME_MAX
extern unsigned short _osmajor, _osminor;
extern const char * _os_flavor;
*** posix/sys/stat/stat.c~5 Sat Apr 27 10:47:24 1996
--- posix/sys/stat/stat.c Sun Aug 11 18:04:52 1996
***************
*** 819,824 ****
--- 819,825 ----
{
int e = errno;
char pathname[MAX_TRUE_NAME], *p;
+ int pathlen;
if (!path || !statbuf)
{
***************
*** 826,838 ****
return -1;
}
! strcpy(pathname, path);
! p = pathname + strlen(pathname) - 1;
/* Get rid of trailing slash. It confuses FindFirst and also causes
the inode-inventing mechanism think d:/path/ and d:/path are
different, because _truename() retains one trailing slash. But
leave alone a trailing slash if it's a root directory, like in
"/" or "d:/" */
while (p > pathname && p[-1] != ':' && (*p == '/' || *p == '\\'))
*p-- = '\0';
--- 827,845 ----
return -1;
}
! if ((pathlen = strlen (path)) >= MAX_TRUE_NAME)
! {
! errno = ENAMETOOLONG;
! return -1;
! }
!
! memcpy(pathname, path, pathlen + 1);
/* Get rid of trailing slash. It confuses FindFirst and also causes
the inode-inventing mechanism think d:/path/ and d:/path are
different, because _truename() retains one trailing slash. But
leave alone a trailing slash if it's a root directory, like in
"/" or "d:/" */
+ p = pathname + pathlen - 1;
while (p > pathname && p[-1] != ':' && (*p == '/' || *p == '\\'))
*p-- = '\0';
- Raw text -