From: uz Date: Sun, 3 Jun 2012 15:48:32 +0000 (+0000) Subject: Parse the name passed to opendir(). X-Git-Tag: V2.14~390 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=ea51c5a4e2b257d592599cafbdf4f6c57366606d;p=cc65 Parse the name passed to opendir(). git-svn-id: svn://svn.cc65.org/cc65/trunk@5678 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/cbm/opendir.c b/libsrc/cbm/opendir.c index 8b2334da9..c23aa0d51 100644 --- a/libsrc/cbm/opendir.c +++ b/libsrc/cbm/opendir.c @@ -11,16 +11,28 @@ -DIR* __fastcall__ opendir (const char*) +DIR* __fastcall__ opendir (register const char* name) { unsigned char buf[32]; - DIR* dir = 0; DIR d; + DIR* dir = 0; - /* Setup file name and offset */ + /* Setup the actual file name that is sent to the disk. We accept "0:", + * "1:" and "." as directory names. + */ d.name[0] = '$'; - d.name[1] = '\0'; - d.off = sizeof (buf); + if (name == 0 || name[0] == '\0' || (name[0] == '.' && name[1] == '\0')) { + d.name[1] = '\0'; + } else if ((name[0] == '0' || name[0] == '1') && name[1] == ':' && name[2] == '\0') { + d.name[1] = name[0]; + d.name[2] = '\0'; + } else { + errno = EINVAL; + goto exitpoint; + } + + /* Set the offset of the first entry */ + d.off = sizeof (buf); /* Open the directory on disk for reading */ d.fd = open (d.name, O_RDONLY); @@ -42,6 +54,7 @@ DIR* __fastcall__ opendir (const char*) } } +exitpoint: /* Done */ return dir; }