Today I checked file /win32/readdir.c Below you can view its source with my comments.
================begin of /win32/readdir.c source===============
DIR *opendir(const char *dir)
{
DIR *dp;
char *filespec;
long handle;
/* - [index] must have (size_t) type (see it usage below)
*/
int index;/* - there is no type casting from (void *) to (char *)
- there is no error check after malloc
- why do not use emalloc according to CODING_STANDARDS?
*/
filespec = malloc(strlen(dir) + 2 + 1);
strcpy(filespec, dir);
/* - function strlen() returns value of type (size_t), not (int)
- is strlen(dir) != strlen(filespec) ?
*/
index = strlen(filespec) - 1;
/* - memory access violation if dir == '\\'
- wrong behaviour if dir == 'something/////'. All trailing slashes must be deleted
- CODING_STANDARDS violation
*/
if (index >= 0 && (filespec[index] == '/' ||
(filespec[index] == '\\' && !IsDBCSLeadByte(filespec[index-1]))))
filespec[index] = '\0';
strcat(filespec, "/*");
/* - there is no error check after malloc
- why do not use emalloc according to CODING_STANDARDS?
*/
dp = (DIR *) malloc(sizeof(DIR));
dp->offset = 0;
dp->finished = 0;
/* - there is no error check after strdup
*/
dp->dir = strdup(dir); if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) {
/* - CODING_STANDARDS violation
*/
if (errno == ENOENT)
dp->finished = 1;
/* - CODING_STANDARDS violation
- memory leak
*/
else
return NULL;
}
dp->handle = handle;
free(filespec);return dp; }
struct dirent *readdir(DIR *dp)
{
/* - CODING_STANDARDS violation
- are you sure that NULL == 0 on any system ?
*/
if (!dp || dp->finished)
return NULL; if (dp->offset != 0) {
if (_findnext(dp->handle, &(dp->fileinfo)) < 0) {
dp->finished = 1;
return NULL;
}
}
dp->offset++; /* - is strlen(dp->dent.d_name) != strlen(dp->fileinfo.name) ?
faster way is:
str_len = strlen(dp->fileinfo.name);
str_len = str_len > _MAX_FNAME ? _MAX_FNAME : str_len;
memcpy(dp->dent.d_name, dp->fileinfo.name, str_len);
dp->dent.d_name[str_len] = '\0';
dp->dent.d_reclen = str_len;
*/
strlcpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME+1);
dp->dent.d_ino = 1;
dp->dent.d_reclen = strlen(dp->dent.d_name);
dp->dent.d_off = dp->offset;return &(dp->dent); }
int readdir_r(DIR *dp, struct dirent *entry, struct dirent **result)
{
/* - are you sure that NULL == 0 on any system ?
*/
if (!dp || dp->finished) {
*result = NULL;
return 0;
} if (dp->offset != 0) {
if (_findnext(dp->handle, &(dp->fileinfo)) < 0) {
dp->finished = 1;
*result = NULL;
return 0;
}
}
dp->offset++; /* - same as in readdir()
*/
strlcpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME+1);
dp->dent.d_ino = 1;
dp->dent.d_reclen = strlen(dp->dent.d_name);
dp->dent.d_off = dp->offset;memcpy(entry, &dp->dent, sizeof(*entry));
*result = &dp->dent;
return 0; }
int closedir(DIR *dp)
{
/* - CODING_STADNARDS violation
- is NULL == 0 ?
*/
if (!dp)
return 0;
_findclose(dp->handle);
if (dp->dir)
/* - why dont use efree according to CODING_STANDARDS ?
*/
free(dp->dir);
if (dp)
free(dp);return 0; }
int rewinddir(DIR *dp)
{
/* Re-set to the beginning */
char *filespec;
long handle;
/* - [index] must be (size_t) type
*/
int index;_findclose(dp->handle);
dp->offset = 0;
dp->finished = 0; /* - missing type casting from (void *) to (char *)
- missing error check after malloc
- CODING_STANDARDS violation. Why dont use emalloc ?
*/
filespec = malloc(strlen(dp->dir) + 2 + 1);
strcpy(filespec, dp->dir);
/* - missing type casting from (size_t) to (int)
*/
index = strlen(filespec) - 1;
/* - were is IsDBCSLeadByte() check ?
- CODING_STANDARDS violation
- wrong behaviour if filespec = 'something/////'
*/
if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\'))
filespec[index] = '\0';
strcat(filespec, "/*"); if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) {
/* - CODING_STANDARDS violation
*/
if (errno == ENOENT)
dp->finished = 1;
}
dp->handle = handle;
free(filespec);
/* - where is tab ? */
return 0;
}
================end of /win32/readdir.c source===============-- Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
